WCF服务可测试性和依赖性注入

时间:2013-01-08 19:11:53

标签: c# asp.net-mvc wcf dependency-injection

我有一个 WCF服务,它位于 MVC应用程序中。服务与多个存储库(我的代码优先设计)交互以完成其工作。目前我在每个Service方法中创建了所有Repository类的实例,我认为它很糟糕,我的Service完全耦合到Repository类。我想知道如何为WCF服务实现一个漂亮而干净的DI。

先谢谢。

2 个答案:

答案 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(....);
    }
}

使用这种方法,您只需要注册和解析您的存储库工厂,而不是所有单独的存储库。这是一种混合方法,但我认为它非常简洁易懂。当然,您始终无法使用工厂并在每次通话中解析您的存储库。如果你愿意的话,我也可以展示一个样本。