2017-09-13 47 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

相關問題