【问题标题】:WCF Service Testability and Dependency InjectionWCF 服务可测试性和依赖注入
【发布时间】:2013-01-08 19:11:52
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 如果你自己没有找到模板代码,我明天可以给你发我的,如果那时没有人的话。正如我看到你的问题,它是:“如何使用 Unity 为 wcf 服务实现 DI”
  • @CasperLeonNielsen 谢谢任何帮助将是有用的。我明天会检查你的回复。

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


【解决方案1】:

您可以采取的一种方法是在您的服务类中注入一个存储库工厂,然后从该工厂调用/获取您的存储库。

存储库工厂:

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

使用这种方法,您只需注册和解析您的存储库工厂,而不是所有单独的存储库。这是一种混合方法,但我认为它非常干净且易于理解。当然,您总是可以不使用工厂并在每次调用中解析您的存储库。如果您愿意,我也可以展示一个示例。

【讨论】:

  • 谢谢爸爸,我也很高兴看到这样的方式。
【解决方案2】:

我建议使用依赖倒置原则:让您的存储库实现一个特定的接口,然后让您的服务类接受该接口(或多个接口)的一个(或多个对象)。不要让它直接引用具体类。然后,您需要对服务类执行的所有操作就是调用接口公开的方法,以调出您想要的任何/所有信息。

这样做将使代码彼此分离,因为它们都依赖于抽象,并且您仍然可以获得您所请求的出色功能。

您可以这样做:假设您的 WCF 服务类需要 RepositoryA,它实现了 IRepositoryA。您要做的是在其上有一个 IRepositoryA 类型的字段(通常为 private)。然后在服务中创建一个构造函数,该构造函数接受 IRepositoryA 类型的对象,然后使用传入的对象设置字段变量。类似于this site 上的内容:

有关依赖倒置原则的更多信息,请阅读鲍勃叔叔has to say

【讨论】:

  • +1 感谢您的回复,是的,我的存储库类扩展了它们自己的接口。问题是我不知道我应该如何以及在哪里按照你说的去做?
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2012-02-09
  • 2012-12-23
相关资源
最近更新 更多