用于封装通用数据源的接口定义

时间:2018-02-28 13:55:44

标签: c# design-patterns abstraction solid-principles

我目前正在开发基于C#插件的设计,其中插件API方法可以访问Context对象,该对象将包含该方法工作所需的相关信息。在当前实现中,文件路径被配置为Context属性之一,因为它必须在解析文件并加载API中的其他方法将使用的信息层次结构时将其提供给其中一个主要方法。但是,Context接口中所需的灵活性是能够容纳各种各样的数据源,而不仅仅是基于文件的数据源,例如:在稍后的时间点,现在以文件形式出现的数据可能被基于DB的数据源或网络流替换,或者由Web服务调用返回的JSON数据替换。当前界面如下:

public interface IFlowContext : IPluginContext
{
    string FlowFilePath { get; set; }
    string FlowImportFilePath { get; set; }
}

我在确定一个足够通用的基于数据源的接口定义时遇到了一些困难,以便处理所需的灵活性。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

答案是不要尝试创建一个界面“#34;泛型”"足以设置当前实现和未来实现所需的设置。应该为依赖于它的类编写每个接口。您可能仍然会发现一些通用性,您可以重用其中一些接口。例如,您可以使用依赖于文件路径的类的不同实现。但是,没有理由说,如果两个不同的类依赖于两个不同的数据源,一个接口应该能够为它们提供设置。

不要混淆 - 无论这些文件路径支持什么,是可重用的接口。但这些实现可能需要不同的设置。这个需要文件路径。另一个可能需要数据库连接字符串或不同的东西。但是,这些实现不需要依赖于某些通用接口。它们都应该依赖于"描述"每个人的实施需要什么。

这涉及接口隔离原理。如果实现需要文件路径,则它应该依赖于提供文件路径的接口。但是如果一个实现不需要文件路径,那么它就不应该依赖于提供它们的接口。

举例说明:

get_queryset

public interface IGetsSomeData { Data GetSomeData(); } public class GetsSomeDataFromAFile : IGetsSomeData { private readonly IFilePathSettings _filePathSettings; public GetsSomeDataFromAFile(IFilePathSettings filePathSettings) { _filePathSettings = filePathSettings; } public DataGetSomeData() { // read data from a file using a file path } } public class GetsSomeDataFromSql : IGetsSomeData { private readonly IDatabaseSettings _databaseSettings; public GetsSomeDataFromAFile(IDatabaseSettings databaseSettings) { _databaseSettings = databaseSettings; } public DataGetSomeData() { // execute a SQL query using a connection string } } 是一个通用界面。但实现不需要共享依赖项。也许SQL实现甚至不需要接口 - 它可能只需要一个连接字符串。