2017-09-13 19 views
4

是否可以将类型注入构造函数而不是实例? 如果是这样如何实现?我希望避免显式注册工厂方法或尽可能原位解析实例。如何使用Unity将类型而不是实例注入到构造函数中

public interface IJob { } 
public class TheJob : IJob { } 

public interface IService 
{ 
    string GetTypeDesc(); 
} 

public class Service : IService 
{ 
    private Type _jobType; 

    public Service(Type jobType) 
    { 
     _jobType = jobType; 
    } 

    public string GetTypeDesc() 
    { 
     return _jobType.ToString(); 
    } 
} 

登记有明确定义构造函数的类型,即使它看来,团结想注入一个实例到类型占位符。

Type jobType = typeof(TheJob);  
(new UnityContainer()).RegisterType<IService, Service>(new InjectionConstructor(jobType)); 

回答

1

InjectionConstructor构造函数对象的数组,这可以通过使用InjectionConstructor(因为你已经这样做)来完成。如果传递给InjectionConstructor(在数组中)的构造函数的对象的类型是Type类型,则unity将尝试解析该类型,然后将结果传递给构造函数(例如'Service')。

例如,如果您使用new InjectionConstructor(typeof(IMyOtherService)),那么统一将期望Service的构造函数采用类型为IMyOtherService的实例,并将使用容器来解析此类型。换句话说,Type是您需要以特定方式处理的特殊情况。

要解决您的问题,您应该告诉Unity您所传递的Type实际上是一个构造函数参数。你可以这样做是这样的:

new InjectionConstructor(new InjectionParameter(jobType)) 

这种力量的团结治疗jobType作为构造函数的参数。

欲了解更多详情,请参阅该InjectionParameterValue.ToParameter方法在这里:https://github.com/unitycontainer/unity/blob/master/source/Src/Unity-CoreClr/Injection/InjectionParameterValue.cs

+0

如果我这样做与RegisterType <,>我得到一个错误:类型UnitySample.Service没有一个构造函数,采用参数(RuntimeType)。我开始认为这是不可能的,没有一些包装或中间工厂,这是一个耻辱。 – user183872

+0

@ user183872,它的工作原理。看到这个:https://dotnetfiddle.net/5IvzpJ –

+0

@ user183872,正在使用.NET框架4.5? –

1

Is it possible to inject a type into a constructor instead of an instance?

System.Type一个是一个不明确的类型,就像原始类型如System.StringSystem.Int32。它们被认为是不明确的,因为在运行时有多种(或许多)这种类型的可能值。这可以防止DI容器自动为您解析和注入此类值的实例。

这意味着您应该手动向Unity提供值。使用InjectionFactory

.RegisterType<IService, Service>(new InjectionConstructor(jobType)) 

或者:

.Register<IService>(new InjectionFactory(c => new Service(jobType))) 
+0

以上导致统一例外,虽然(类型UnitySample.Service没有一个构造函数的参数(TheJob)。) – user183872

+0

@ user183872:应该工作。 [阅读本文](https://msdn.microsoft.com/en-us/library/dn507497(v = pandp.30).aspx)获得关于它的信息。 – Steven

+0

我我错过了什么? https://dotnetfiddle.net/4ctRxJ – user183872

相关问题