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

use*_*993 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ann 6

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

不,这是DI容器的重点,但使用容器也有缺点.偏爱纯DI在使用DI容器,因为这将教你如何只使用第一原则,使用依赖注入.

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

你没有.DI容器只能在组合根中使用(如果您根本使用DI容器).