繁体   English   中英

C#中的数据存储库接口

[英]Data Repository Interface in C#

因此,我为请求处理程序提供了以下基本接口:

public interface IRequestHandler<T> where T : EventArgs
{
    event EventHandler<T> EventHandler;

    void Start();
    void Stop();
}

这些RequestHandler是处理传入请求的不同方法,无论这些请求来自SMS,电子邮件还是其他任何形式。

现在我的问题是,每个处理程序都将其数据保存在不同的存储库中,例如数据库,平面文件或联机存储。 我想通过将相同的数据存储注入共享该存储库的各种处理程序中,使自己更轻松地管理这些存储库中的数据。 但是,这些存储库使用不同的连接参数等。

哪种图案最适合? 工厂模式似乎是我所追求的,但是我不确定。

我认为您正在寻找依赖注入,其中每个处理程序都将使用相同的依赖注入容器来获取自身所需的任何资源。

稍微简单一点,而不使用完整的DI,您可以创建一个“存储库”来管理对实际存储库的访问。 因此,您将拥有一个RepositoryRepository (可以随意发明一个更好的名称),它具有方法GetDatabase()GetOnlineStorage()等,它们返回适当的存储库。

在构建处理程序期间,您只需要将单个存储库传递给它即可。

我想说您创建了另一个处理保存操作的IDataRepository接口,为此您将有多个实现(DB,文件或其他)。 然后,您的请求处理程序应依赖于该接口。 并且每个存储库实现都应自己关心连接字符串。 像这样:

public class SmsHandler : IRequestHandler<EventArgs>
{
    private IDataRepository dataRepository;

    public SmsHandler(IDataRepository dataRepository)
    {
        this.dataRepository = dataRepository;
    }

    public event EventHandler<EventArgs> EventHandler;
    public void Start()
    {
        // save your data or something.. 
        dataRepository.Save(new object());
        // do start
    }

    public void Stop()
    {
        // do end
    }
}

public class EmailHandler : IRequestHandler<EventArgs>
{
    private IDataRepository dataRepository;

    public EmailHandler(IDataRepository dataRepository)
    {
        this.dataRepository = dataRepository;
    }

    public event EventHandler<EventArgs> EventHandler;
    public void Start()
    {
        // do start
    }

    public void Stop()
    {
        // do end
    }
}


public interface IDataRepository
{
    // or whatever you need here
    void Save(object data);
}

public class FlatFileDataRepositories : IDataRepository
{
    public void Save(object data)
    {
        // save in file
    }
}

public class DatabaseRepository : IDataRepository
{
    public void Save(object data)
    {
        // save in the database
    }
}

然后,配置“依赖注入”容器以提供存储库的正确实现。 这样,您的处理程序就不会以任何方式与连接字符串耦合-为您提供更好的可测试性和应用程序体系结构。

并且不要在这里使用工厂-这种模式已经被DI容器所取代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM