2016-09-29 56 views
0

我們使用Unity依賴注入。我們有一個類需要傳遞給它的構造函數的類型。如何在使用Unity依賴注入時將類型作爲參數傳遞給構造函數

public interface ITest 
{ 
} 

public class Test : ITest 
{ 
    public Test(Type myType) 
    { 

    } 
} 

在容器boostrapper我們註冊我們的類型:

public static IUnityContainer Start() 
{ 
    IUnityContainer container = UnityInversionOfControlContainer.RegisterContainer(); 

    container.RegisterType<ITest, Test>(); 

    return container; 
} 

我們決心像這樣:

object actual = container.Resolve<ITest>(new ParameterOverride("myType", typeof(string))); 

此提供以下錯誤:

Microsoft.Practices.Unity .ResolutionFailedException:依賴項的解析失敗,type =「ITest」,name =「(none)」。 發生異常時:解析時。 異常是:InvalidOperationException - 無法構造字符串類型。您必須配置容器以提供此值。

在異常時,該容器是:

解決測試,(無)(從Belastingdienst.Omvormers.Mapper.ITest映射,(無))構造試驗 解決參數 「的myType」( System.Type myType) 正在解析System.String,(無) ---> System.InvalidOperationException:無法構造String類型。您必須配置容器以提供此值。

看來,統一想通過容器來解析類型,並傳入一個類型的實例,但我確實需要類型。

想到任何人?

+0

你的意思'container.Resolve ...'?它似乎不工作的參數類型'類型',我嘗試'字符串',它工作正常。可能是一個團結的錯誤。 – Haukinger

+0

嘗試註冊'myType'和'typeof(string)'作爲一個實例不是一個類型 –

回答

1

答案載於從張貼Haukinger鏈接代碼:

object actual = 
    container.Resolve<IDatarecordSerializer>(
     new ParameterOverride(
      "type", 
      new InjectionParameter(typeof(string)) 
     ) 
    ); 

在此期間,通過改變依賴的類型,像這樣隱藏團結Type

+0

它不起作用,同樣的問題,Unity會嘗試解決一個'字符串'不是一個typeof(字符串) – Dan

+0

這實際上工作,很好找! 'InjectionParameter'派生自'InjectionParameterValue',因此'InjectionParameterValue.ToParameter'可以直接使用它而不需要重新打包。 – Haukinger

0

實際上,Unity明確地將Type的值視爲ParameterOverride而不是字面值,而是應該自己解析的類型。然後它試圖解決類型爲string的實例,並且顯然失敗。

ParameterOverride將該值存儲在一個InjectionParameterValue實例中,該實例將其解釋爲Type與其他類型不同。

見線InjectionParameterValue.cs

77ff我會嘗試使用Unity創建一個問題,但我想這是一個多臭蟲功能的...

class HiddenType 
{ 
    public Type Type 
    { 
     get; 
    } 

    public HiddenType(Type type) 
    { 
     Type = type; 
    } 
} 
+0

這就是要點:我需要的類型作爲參數傳遞,因爲構造函數要求,而不是由容器解決的實例如果你不能通過容器 –

+0

使用泛型,我想你可以將'Type'包裝在一個虛擬類中,只是爲了將它隱藏起來。相當醜陋,但工作。 – Haukinger

0

更簡單的出路就是註冊一家工廠:

給出:

internal interface ITyped 
{ 
    Type Type { get; } 
} 

internal class Typed : ITyped 
{ 
    public Typed(Type type) 
    { 
     Type = type; 
    } 

    public Type Type { get; } 
} 

FTY:

internal class TypedFactory : ITypedFactory 
{ 
    public ITyped Create(Type type) 
    { 
     return new Typed(type); 
    } 
} 

internal interface ITypedFactory 
{ 
    ITyped Create(Type type); 
} 


container.RegisterType<ITypedFactory, TypedFactory>(); 

Assert.AreEqual(
    container.Resolve<ITypedFactory>().Create(typeof(string)).Type, 
    typeof(string)); 

不是火箭科學,但很簡單,明顯,更容易調試

+0

謝謝,但構造函數是我的課程給定的。類型不是屬性,而是參數。 –

相關問題