我有一个WCF服务它是托管在MVC应用程序。服务与几个存储库(我有Code First设计)交互以完成它的工作。目前,我在每个Service方法中创建了所有Repository类的实例,我认为这很糟糕,而且我的Service完全与Repository类耦合。我想知道我应该如何为WCF服务实现一个漂亮而干净的DI。WCF服务可测试性和依赖注入
在此先感谢。
我有一个WCF服务它是托管在MVC应用程序。服务与几个存储库(我有Code First设计)交互以完成它的工作。目前,我在每个Service方法中创建了所有Repository类的实例,我认为这很糟糕,而且我的Service完全与Repository类耦合。我想知道我应该如何为WCF服务实现一个漂亮而干净的DI。WCF服务可测试性和依赖注入
在此先感谢。
您可以采取的一种方法是在您的服务类中注入一个存储库工厂,然后从工厂调用/获取您的存储库。
库厂:
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(....);
}
}
通过这种方法,你需要注册和解析只有你的仓库工厂,而不是所有的个人资料库。这是一种混合的方式,但我认为它很干净,容易理解。当然,您可以在每次调用时始终不使用工厂并解决您的存储库问题。如果你愿意的话,我也可以展示一个样本。
谢谢爸爸,我也是这样看的。 – saber
@SaberAmani ...你的欢迎 –
我建议使用依赖倒置原则:让你的存储库实现一个特定的接口,然后让你的服务类接受一个或多个接口的对象。不要直接引用具体的类。然后,你需要在你的服务类上做的所有事情就是调用一个接口公开的方法来提供你想要的任何/所有信息。
这样做会将代码彼此分离,因为它们都依赖于抽象,并且仍然可以获得您请求的精彩功能。
下面是你如何可能去做:假设你的WCF服务类需要RepositoryA,它实现IRepositoryA。你会做的是有一个IRepositoryA类型的字段(通常是private
)。然后在接收IRepositoryA类型的对象的服务中创建一个构造函数,然后设置该对象被传入的字段变量。类似于this site上发现的内容:
有关依赖性反转原理的更多信息,只需读什么叔叔鲍勃has to say。
+1感谢您的回复,是的,我的存储库类扩展了自己的接口。问题是我不知道如何以及我应该在哪里做你说的话? – saber
如果你自己找到了模板代码,那么如果当时没有人有明天我可以发布你的明天。正如我看到你的问题,它是:“我如何使用Unity实现一个wcf服务的DI” –
@CasperLeonNielsen感谢任何帮助将是有用的。我明天会检查你的回复。 – saber