Mam hierarchię TrendProviders
, które są używane do dostarczania serii punktów danych (trendów) z różnych źródeł.C# polimorfizm + projektowanie leków generycznych - potrzebne porady
zacząłem z interfejsem Generic:
public interface ITrendProvider<T> where T: TrendResult
{
IEnumerable<T> GetTrends();
}
TrendResult
to klasa wynik z uzyskanych danych trendów i kod stanu pracy:
public class TrendResult
{
public TrendResult()
{
Points = new Dictionary<DateTimeOffset, decimal>();
}
public TrendResultCode Code { get; set; }
public string Name { get; set; }
public string Identifier { get; set; }
public Dictionary<DateTimeOffset, decimal> Points { get; set; }
}
TrendResultCode
jest następująca:
public enum TrendResultCode
{
OK,
DataParseError,
NoData,
UnknownError
}
Istnieją również dwa typy (do tej pory) z Bardziej szczegółowe interfejsy:
IFileTrendProvider
- stosowane w celu otrzymania trendy żadnych plików.IServerTrendProvider
- służy do uzyskiwania trendów ze zdalnych serwerów, na przykład przy użyciu protokołu FTP.
IFileTrendProvider
idzie tak:
public interface IFileTrendProvider : ITrendProvider<TrendResult>
{
IFileReader FileReader {get; set}
FileTrendDiscoveryPattern Pattern {get; set;}
}
IServerTrendProvider
idzie tak:
public interface IServerTrendProvider : ITrendProvider<TrendResult>
{
IClient Client { get; set; }
Dictionary<string, string[]> RequestedServerTrendIDs { get; set; }
}
Konkretne klasy, która implementuje interfejsy są następujące:
Jednym FileTrend
typu :
public class GenericFileTrendProvider : IFileTrendProvider<TrendResult>
{
public GenericFileTrendProvider() { }
public IFileReader FileReader {get; set}
public FileTrendDiscoveryPattern Pattern {get; set;}
public IEnumerable<TrendResult> GetTrends()
{
// Some code to obtain trends from file using FileReader
}
}
I jeden z rodzaju ServerTrend
:
public class ServerATrendProvider : IServerTrendProvider<TrendResult>
{
public ServerATrendProvider() { }
public IClient Client { get; set; }
public Dictionary<string, string[]> RequestedServerTrendIDs { get; set;}
public IEnumerable<TrendResult> GetTrends()
{
// Some code to obtain trends from remote server using Client
}
}
Teraz, co chcę osiągnąć i gdzie ja potrzebuję twojej pomocy i porady:
IFileReader
wprowadza własne kody błędów:
public enum FileReadResultCode
{
OK,
FileAlreadyOpen,
FileNotFound,
UnknownError
}
IClient
wprowadza również kody błędów operacji specyficznych:
public enum ClientCode
{
OK,
InvalidCredentials,
ResourceNotFounds,
UnknownError
}
Ponieważ zarówno: IFileReader
i IClient
zwraca również własne kody błędów, jak mogłem intruduce je w obiekcie TrendResult
zwróconej przez GetTrends()
metody, tak że w końcu nie będzie też kilka informacji o „wewnętrznej” błąd, konkretny błąd nie tylko TrendResult
?
musiałbym trochę elastyczne rozwiązanie - Myślałam o dziedziczenie z TrendResult
i stworzyć FileTrendResult
i ServerTrendResult
dla każdego z konkretnymi dostawcami, a także zdefiniowania konkretnych wyliczeń błędach zarówno dlatego, że wrócą własny typ wyniku, ale może to zrobić w jakiś inny sposób?
Świetne pytanie pitersmx. Zwykle nie dodajemy żadnych pozdrowień lub dziękujemy za wpis, aby upewnić się, że w poście jest jak najmniej hałasu. Zmieniłem twoje podziękowania za ciebie, tylko że wiesz. – Mafii
Teraz potrzebuję wspaniałej odpowiedzi :) – pitersmx
Czy konkretne wyniki odnoszą się do pojedynczego 'TrendResult' lub czy są one takie same dla wszystkich wyników trendów, które są odczytywane ze źródła (np. Pliku). Na przykład, czy 'GenericFileTrendProvider' odczytuje kilka plików naraz, aby niektóre z zwróconych' TrendResults' mogły mieć kod 'FileNotFound', podczas gdy inne miałyby' Ok' lub inny kod? – Markus