【问题标题】:How to use Unity for dependency injection (simple example)如何使用 Unity 进行依赖注入(简单示例)
【发布时间】:2015-09-21 18:22:01
【问题描述】:

考虑这个类与这两个构造函数:

public class DocumentService
{
    private IDocumentDbService documentDbService;
    private IDirectoryService directoryService;
    private IFileService fileService;

    // Constructor
    public DocumentService()
    {
          this.documentDbService = new DocumentDbService();
          this.directoryService = new DirectoryInfo();
          this.filService = new FileInfo();
    }

    // Injection Constructor
    public DocumentService(IDocumentDbService dbs, IDirectoryService ds, IFileService fs)
    {
         this.documentDService = dbs;
         this.directoryService = ds;
         this.fileService = fs;
    }
}

我使用第二个构造函数来模拟单元测试的依赖项。

有时候依赖太多,所以注入构造函数的参数太多了。

所以,我想使用Unity 依赖注入。

问题

如何重构此代码以改用Unity

(在阅读了Unity的文档后,仍然不确定如何在我的代码上正确使用它。)

【问题讨论】:

  • 很确定您会为大多数 DI 框架使用完全相同的代码。您通常在运行时通过配置文件从我所见过的 DI 示例中提供依赖项(Ninject、Unity、structuremap 都有自己的配置风格/语法)。
  • 你说你想重构这段代码来使用统一。而不是什么?
  • 抛弃默认构造函数;拥有multiple constructors is an anti-pattern
  • 我也一直在学习如何使用 Unity Containers,您的问题反映了我一直在寻找的问答类型;我希望有人能够清楚地表达这个问题的答案。

标签: c# unit-testing dependency-injection unity-container


【解决方案1】:

假设您想简化单元测试代码以避免在每个测试中手动设置每个依赖项:

您可以设置容器并在那里添加所有必要的模拟,然后 Resolve 您可以为测试上课,例如:

 // that initialization can be shared
 var container = new UnityContainer();
 // register all mocks (i.e. created with Moq)
 container.RegisterInstnce<IDocumentDbService>(Mock.Of<IDocumentDbService> ());

 // resolve your class under test 
 var documentService = container.Resolve<DocumentService>();

 Assert.AreEqual(42, documentService.GetSomething());

【讨论】:

    【解决方案2】:

    我怀疑你想在两种情况下注入依赖项:在(单元)测试中(例如使用 RhinoMocks)和实际实现中(使用 Unity)。在这种情况下,重构意味着您应该删除第一个构造函数(属于 DocumentService 类)。依赖项中所需的配置应加载到依赖项本身中:DocumentDbService、DirectoryInfo、FileInfo。更多信息(如依赖注入生命周期)和一些示例可在 MSDN 上找到,请参阅 https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多