Ioc / DI - 如何使用已注册的依赖项?

时间:2015-11-22 21:23:46

标签: c# dependency-injection inversion-of-control unity-container

我想我错过了如何实际使用IoC / DI的关键部分。我碰巧使用的是Unity容器。我知道如何设置一个类来注入它的依赖项,我也知道如何使Unity注册类型。

但我不知道的是如何实际使用这些注册。

例如:

var container = new UnityContainer();
container.RegisterType<IRepository, XmlRepository>();

var service = new MyService(container.Resolve<IRepository>());

public interface IRepository
{
    void GetStuff();
}

public class XmlRepository : IRepository
{
    public void GetStuff()
    {
        throw new NotImplementedException();
    }
}

public class MyService
{
    private readonly IRepository _myRepository;
    public MyService(IRepository repository)
    {
        _myRepository = repository;
    }
}

这里我有一个服务层,它接受IRepository类型的参数。这是容器部分,我似乎不理解。

  • 每次我需要创建实例时,IoC / DI是否能够不必手动解析类型?在我的代码中我得到容器来解析一个类型,除非我误解了它应该如何工作,是不是容器应该以某种方式自动(用反射?)注入我告诉它使用的依赖我注册类型? var service = new MyService(...)正在调用container.Resolve这样做的正确方法吗?
  • 我创建了一个容器,但如何在项目/代码中共享此容器?这与第一个问题有关。我以前认为有一个地方可以注册类型。到目前为止,我能看到如何解决这个问题的唯一方法是:
    • 在我使用它们的地方继续注册类型,最后是重复的代码
    • 将容器传递到我将要解决的每个地方类型
    • 这些方式都不是我期望这样做的方式

3 个答案:

答案 0 :(得分:6)

  

IoC / DI的重点是,每次我需要创建实例时都不必手动解析类型吗?

不,这是 DI Container 的重点,但使用容器也有缺点。支持Pure DI使用DI容器,因为这将教你如何仅使用第一原则来使用依赖注入。

  

我已创建了一个容器,但如何在项目/代码中共享此容器?

你不是。 DI容器只能在Composition Root中使用(如果您根本使用DI容器)。

答案 1 :(得分:1)

将容器设置放在程序启动时运行的模块中。例如,您可以从{% set current_template = 'template_x.html' %} 调用它。这称为启动过滤器。

有关如何执行此操作的详细示例,请参阅Dependency Injection with Unity

答案 2 :(得分:1)

您无需执行new MyService(container.Resolve<IRepository>())。要获取MyService的实例,只需使用container.Resolve<MyService>();它会自动解析MyService的依赖关系。