如何使用Unity进行依赖注入(简单示例)

时间:2015-09-21 18:22:01

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

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

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个文档后,仍不确定如何在我的代码中正确使用它。)

2 个答案:

答案 0 :(得分:2)

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

您可以设置容器并在那里添加所有必要的模拟,而不是您为测试类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());

答案 1 :(得分:0)

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