【问题标题】:Repository pattern question存储库模式问题
【发布时间】:2011-04-05 21:53:39
【问题描述】:

我首先为我的每个实体创建了一个新的存储库接口,例如IClient 存储库。然后我为每个实体创建了一个类,例如SqlClient 存储库。我对我的很多实体都这样做了,然后意识到它们都有相同的方法:添加、更新、删除、GetAll。

所以我意识到我应该只制作一个界面,而不是为每个界面制作一个单独的界面。

问题是现在我的依赖注入不起作用,因为我只能将接口映射到一个存储库:

Bind<IClientRepository>().To<SqlClientsRepository>().WithConstructorArgument("connectionString", WebConfigurationManager.ConnectionStrings["MyDb"].ConnectionString);

我能看到的唯一解决方法是合并所有存储库或返回我的第一次尝试。使用第一次尝试还可以让我更改某些实体的返回类型,例如IClientRepository.Add() 可以返回新客户端的 id,而其他一些实体可能不需要它。

欣赏任何想法。

【问题讨论】:

    标签: c# repository-pattern design-patterns


    【解决方案1】:

    您可以让您的 ClientRepository 实现您的 BaseRepository一个特定的 IClientRepository。这样,您的 Base 可以具有通常的 Add/Remove 等,并且您的 IClientRepository 可以具有专门的方法(或者在某些情况下可能为空)。您的 IoC 可以使用您的 IClientRepository 解决。

    这就是我的做法:

    public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository {...}
    and
    unityContainer.RegisterType<ICustomerRepository, CustomerRepository>();
    

    祝你好运:)

    【讨论】:

    • 是的,我忘了提到这是一个选项,我实际上已经这样做了。现在所有这些接口都是空白的(还不需要方法)似乎很奇怪。另外,如果我想为一个实体返回类型返回不同的东西,就像我在问题中提到的那样?
    • 如果你想在少数情况下返回不同的东西,你可以把它放在你的特定界面上——除非你当然希望在你的基础上同时添加/删除/全部等,在这种情况下你应该可能考虑根本不使用 baserepository?
    【解决方案2】:

    存储库的一种常见方法是使用通用 CRUD 方法或所有存储库都可以使用的方法创建一个基本接口,如“IRepository”。然后为每个特定的存储库创建一个新接口,该接口派生自基本接口,但包含该存储库的特定于域的方法。可以对基础 Repository 实现和更具体的实现类执行相同的操作。这样一来,您就有了一个通用功能的通用位置,但您仍然为每个具体的域特定存储库实现提供了特定的接口。

    【讨论】:

      【解决方案3】:

      如果不知道您要完成什么,就很难确定。在我的最新项目中,每个类都有一个存储库IRepository&lt;T&gt;。这可能会让你摆脱 IoC 绑定的麻烦。

      【讨论】:

        【解决方案4】:

        一种解决方案是使接口通用。这样,它就足够通用了,同时仍然很灵活。

        【讨论】:

          猜你喜欢
          • 2014-09-19
          • 2015-01-22
          • 2014-07-27
          • 1970-01-01
          • 1970-01-01
          • 2020-03-05
          • 2016-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多