gpt4 book ai didi

c# 多态性 + 泛型设计 - 需要建议

转载 作者:太空狗 更新时间:2023-10-29 21:43:13 32 4
gpt4 key购买 nike

我的层次结构为 TrendProviders用于提供来自不同来源的一系列数据点(趋势)。

我从通用接口(interface)开始:

public interface ITrendProvider<T> where T: TrendResult
{
IEnumerable<T> GetTrends();
}

TrendResult是一个结果类,带有获取到的趋势数据和运行状态码:

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如下:

public enum TrendResultCode
{
OK,
DataParseError,
NoData,
UnknownError
}

还有两种(到目前为止)更详细的接口(interface):

  • IFileTrendProvider - 用于从任何文件中获取趋势。

  • IServerTrendProvider - 用于从远程服务器获取趋势,例如使用 FTP。

IFileTrendProvider是这样的:

public interface IFileTrendProvider : ITrendProvider<TrendResult>
{
IFileReader FileReader {get; set}
FileTrendDiscoveryPattern Pattern {get; set;}
}

IServerTrendProvider是这样的:

public interface IServerTrendProvider : ITrendProvider<TrendResult>
{
IClient Client { get; set; }
Dictionary<string, string[]> RequestedServerTrendIDs { get; set; }
}

实现接口(interface)的具体类如下:

FileTrend 之一输入:

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
}
}

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
}
}

现在,我想要实现的目标以及我需要您的帮助和建议的地方:

IFileReader引入了自己的错误代码:

public enum FileReadResultCode
{
OK,
FileAlreadyOpen,
FileNotFound,
UnknownError
}

IClient还介绍了它具体的运行错误码:

public enum ClientCode
{
OK,
InvalidCredentials,
ResourceNotFounds,
UnknownError
}

作为两者:IFileReaderIClient还返回自己的错误代码,我怎么能在 TrendResult 中引入它们呢? GetTrends() 返回的对象方法,所以最后还会有一些关于“内部”错误的信息,而不仅仅是TrendResult具体错误?

我需要一些灵活的解决方案 - 我正在考虑从 TrendResult 继承并创建一个 FileTrendResultServerTrendResult对于每个具体的提供者,还为两者定义一个特定的错误枚举,以便它们返回自己的结果类型,但是可以通过其他方式完成吗?

最佳答案

与其在枚举中使用预定义的可能错误列表(TrendResultCodeFileReadResultCodeClientCode,...),您可以更改 TrendResult 类来存储异常列表并删除枚举:

public class TrendResult
{
// ...
// public TrendResultCode Code { get; set; }
public IEnumerable<Exception> Errors { get; set; }
// ...
}

这样,您可以存储错误的完整信息,包括堆栈跟踪和其他有值(value)的信息(如果单个 TrendResult 中存在多个问题,则可以存储多个错误的信息)。即使是意外错误,您也可以存储详细信息,而不是出现难以追踪的未知错误。

如果 TrendResult 在枚举中没有任何项目,则没有问题。否则,您可以将信息放入日志中。

实现遵循 Open/Closed principle ,因此如果出现导致错误的新条件,您不必更改处理 TrendResults 的实现。

对于您的业务异常(exception)情况,例如解析错误,您应该创建特定的异常类型,以便稍后可以根据它们的类型分析这些错误。

关于c# 多态性 + 泛型设计 - 需要建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715068/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com