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的目的不是每次需要创建实例时都不必手动解析类型吗?
不,这就是DI容器的要点,但使用容器也有缺点。与使用DI容器相比,更喜欢纯DI,因为这将教会您如何仅使用第一原则使用依赖注入。
我已经创建了一个容器,但如何在我的项目/代码中共享这个容器?
你没有。DI容器应仅在Composition Root中使用(如果您使用的是DI容器)。
将容器设置放在程序启动时运行的模块中。例如,您可以从Main
调用它。这被称为引导带。
有关如何做到这一点的一个好例子,请参阅Unity的依赖注入。
您不需要执行new MyService(container.Resolve<IRepository>())
。要获得MyService
的实例,只需使用container.Resolve<MyService>()
;它将自动解析CCD_ 8的依赖关系。