用于封装通用数据源的接口定义[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于封装通用数据源的接口定义[关闭]相关的知识,希望对你有一定的参考价值。

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

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

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

有人有什么想法吗?

答案

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

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

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

为了显示:

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

IGetsSomeData是一个常见的界面。但实现不需要共享依赖项。也许SQL实现甚至不需要接口 - 它可能只需要一个连接字符串。

以上是关于用于封装通用数据源的接口定义[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java 封装

Java 封装

Java 封装

Java 封装

Java 封装

Java 封装