我在DI框架中一直想要的一件事就是能够将注入构造函数与只与框架交互的对象用于消费服务。例如:
public class ServiceClass : IServiceInterface
{
public string Name { get; set; }
}
public class ConsumerClass // explicitly implements no interfaces
{
private readonly IServiceInterface service;
public IServiceInterface Service { get { return service; } }
[InjectionConstructor]
public ConsumerClass(IServiceInterface service)
{
this.service = service;
}
}
static void Main()
{
IUnityContainer container;
// blah blah DI setup stuff
container.RegisterType<IServiceInterface, ServiceClass>();
// Key point here!
container.Instantiate<ConsumerClass>();
// Alternatively:
container.Instantiate(typeof(ConsumerClass));
}
IUnityContainer的BuildUp()方法可以做到这一点,但它要求你有一个实例传入,如果我想使用注入构造函数,我就不能这样做。
此外,我可以使用:
container.RegisterType(typeof(ConsumerClass),
new InjectionConstructor(container.Resolve<IServiceClass>()));
但是,这需要编写很多代码 - 特别是对于可能在构造函数中有多个参数的类 - 并且似乎首先删除了容器的实用程序。
还有:
container.RegisterType<ConsumerClass, ConsumerClass>();
然而,对于这个,我实际上并不想注册该类型 - 我只是希望通过InjectionConstructor填充其依赖项来创建它。
总结一下:我想使用注入构造函数,我希望Unity为我做注册服务的映射,如果可能的话,我想让我的消费者远离容器。有没有办法做到这一点,我错过了?
答案 0 :(得分:1)
正如您所发现的,.BuildUp
方法仅适用于现有实例,使用Unity创建新实例,您希望使用.Resolve
方法,这些方法将创建实例,并在何时注入任何依赖项必需的。
对于您的示例,请使用var consumer = container.Resolve<ConsumerClass>()
并注入所有依赖项。您不需要ConsumerClass
的任何注册,因为它是Unity能够隐式处理的具体类型。