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

本文关键字:注册 依赖 何使用 DI- Ioc | 更新日期: 2023-09-27 18:23:48

我想我错过了如何实际使用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是正确的方法吗
  • 我已经创建了一个容器,但如何在我的项目/代码中共享这个容器?这与第一个问题有关。我以前认为只有一个地方可以注册类型。到目前为止,我能看到的唯一方法是:
    • 无论我在哪里使用,都要继续注册类型,最终会出现重复的代码
    • 将容器传递到我要解析类型的每个地方
    • 这两种方式都不是我所期望的

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

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

不,这就是DI容器的要点,但使用容器也有缺点。与使用DI容器相比,更喜欢纯DI,因为这将教会您如何仅使用第一原则使用依赖注入。

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

你没有。DI容器应仅在Composition Root中使用(如果您使用的是DI容器)。

将容器设置放在程序启动时运行的模块中。例如,您可以从Main调用它。这被称为引导带。

有关如何做到这一点的一个好例子,请参阅Unity的依赖注入。

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