我首先为每个实体创建了一个新的存储库界面,例如IClientRepository。然后我为每个实体制作了一个课程,例如SqlClientRepository。我为很多实体做了这个,然后意识到他们都有相同的方法:添加,更新,删除,GetAll。
所以我意识到我应该只创建一个界面,而不是为每个界面分别创建一个界面。
问题是现在我的依赖注入不起作用,因为我只能将接口映射到一个存储库:
Bind<IClientRepository>().To<SqlClientsRepository>().WithConstructorArgument("connectionString", WebConfigurationManager.ConnectionStrings["MyDb"].ConnectionString);
我能看到的唯一解决方法是将所有存储库组合在一起,或者回到我的第一次尝试。使用第一次尝试还允许我更改某些实体的返回类型,例如IClientRepository.Add()可以返回新客户端的id,而其他一些实体可能不需要它。
欣赏任何想法。
答案 0 :(得分:2)
您可以让ClientRepository同时实现BaseRepository 和特定的IClientRepository。这样你的Base可以有通常的Add / Remove等,你的IClientRepository可以有专门的方法(或者在某些情况下可能是空的)。您的IoC可以使用您的IClientRepository解决。
我就是这样做的:
public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository {...}
and
unityContainer.RegisterType<ICustomerRepository, CustomerRepository>();
祝你好运:)
答案 1 :(得分:0)
存储库的一种常见方法是使用所有repos可以使用的常见CRUD方法或方法创建类似“IRepository”的基本接口。然后,对于每个特定存储库,创建一个从基本接口派生的新接口,但包括该存储库的特定于域的方法。对于基本Repository实现和更具体的实现类,可以做同样的事情。通过这种方式,您可以获得通用功能的通用位置,但是每个具体的特定于域的存储库实现仍然具有特定的接口。
答案 2 :(得分:0)
如果不知道你想要完成什么,很难说肯定。在我的最新项目中,每个类有一个存储库IRepository<T>
。这可能会让你摆脱IoC绑定问题。
答案 3 :(得分:0)
一种解决方案是使接口通用。通过这种方式,它足够通用,同时仍然具有灵活性。