我有一个 WCF服务,它位于 MVC应用程序中。服务与多个存储库(我的代码优先设计)交互以完成其工作。目前我在每个Service方法中创建了所有Repository类的实例,我认为它很糟糕,我的Service完全耦合到Repository类。我想知道如何为WCF服务实现一个漂亮而干净的DI。
先谢谢。
答案 0 :(得分:2)
我建议使用依赖性倒置原则:让您的存储库实现特定的接口,然后让您的服务类接收该接口(或接口)的对象(或多个对象)。不要直接引用具体类。然后,您需要在服务类上执行的操作是调用接口公开的方法,以显示您想要的任何/所有信息。
这样做会将代码彼此分离,因为它们都依赖于抽象,你仍然会得到你要求的精彩功能。
以下是 可以进行此操作的方式:假设您的WCF服务类需要RepositoryA,它实现了IRepositoryA。你要做的是在其上有一个IRepositoryA类型的字段(通常为private
)。然后在服务中创建一个构造函数,该构造函数接收IRepositoryA类型的对象,然后设置传入该对象的字段变量。类似this site上的内容:
有关依赖性倒置原则的更多信息,请阅读Bob叔叔has to say。
答案 1 :(得分:2)
您可以采取的一种方法是在服务类中注入存储库工厂,然后从工厂调用/获取存储库。
存储库工厂:
public interface IRepositoryFactory
{
IRepositoryOne GetRepositoryOne();
IRepositoryTwo GetRepositoryTwo();
}
public class RepositoryFactory: IRepositoryFactory
{
public DataAccess.RepositoryInterfaces.IRepositoryOne GetRepositoryOne()
{
return new RepositoryOne();
}
public DataAccess.RepositoryInterfaces.IRepositoryTwo GetRepositoryTwo()
{
return new RepositoryTwo();
}
}
服务类:
public ServiceClass: IService
{
private readonly IRepositoryFactory _repositoryFactory;
public ServiceClass(IRepositoryFactory factory)
{
_repositoryFactory = factory;
}
public IList<YourItems> GetYourItems()
{
var repository = _repositoryFactory.GetRepositoryOne();
return repository.GetItems(....);
}
}
使用这种方法,您只需要注册和解析您的存储库工厂,而不是所有单独的存储库。这是一种混合方法,但我认为它非常简洁易懂。当然,您始终无法使用工厂并在每次通话中解析您的存储库。如果你愿意的话,我也可以展示一个样本。