我想我错过了如何实际使用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
类型的参数。这是容器部分,我似乎不理解。
var service = new MyService(...)
正在调用container.Resolve
这样做的正确方法吗?答案 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
的依赖关系。