3

是否可以在UnityContainer中配置的另一種類型的構造函數中實例化一個在UnityContainer中配置的類型?以我目前的解決方案,我得到一個Unity IoC:「操作可能會破壞運行時的穩定性」

ResolutionFailedException:
分辨率依賴的失敗,TYPE = 「Sample.IMyProcessor」,名字= 「(無)」。
發生異常時:解析時。
例外情況是:VerificationException - 操作可能會破壞運行時的穩定性。

的問題是,我的第二類(FileLoader)具有應在第一個構造函數進行評估的參數:

MyProcessor類的構造:

public class MyProcessor : IMyProcessor 
{ 
    private readonly IFileLoader loader; 
    private readonly IRepository repository; 

    public MyProcessor(IRepository repository, string environment, Func<SysConfig, IFileLoader> loaderFactory) 
    { 
     this.repository = repository; 
     SysConfig config = repository.GetConfig(environment); 

     loader = loaderFactory(config); 
    } 

    public void DoWork() 
    { 
     loader.Process(); 
    } 
} 

這裏的主要功能與UnityContainer配置:

public static void Run() 
{ 
    var unityContainer = new UnityContainer() 
    .RegisterType<IRepository, MyRepository>() 
    .RegisterType<IFileLoader, FileLoader>() 
    .RegisterType<IMyProcessor, MyProcessor>(new InjectionConstructor(typeof(IRepository), "DEV", typeof(Func<SysConfig, IFileLoader>))); 

    //Tests 
    var x = unityContainer.Resolve<IRepository>(); //--> OK 
    var y = unityContainer.Resolve<IFileLoader>(); //--> OK 

    var processor = unityContainer.Resolve<IMyProcessor>(); 
    //--> ResolutionFailedException: "Operation could destabilize the runtime." 

    processor.DoWork(); 
} 

而且FileLoader類:

public class FileLoader : IFileLoader 
{ 
    private readonly SysConfig sysConfig; 

    public FileLoader(SysConfig sysConfig, IRepository repository) 
    { 
     this.sysConfig = sysConfig; 
    } 

    public void Process() 
    { 
     //some sample implementation 
     if (sysConfig.IsProduction) 
      Console.WriteLine("Production Environement"); 
     else 
      Console.WriteLine("Test Environment"); 
    } 
} 

我認爲問題是關係到Func鍵被傳遞到MyProcessor類。是否有另一種方法將loaderFactory傳遞給MyProcessor類?

謝謝!

回答

5

問題是Unity自動工廠只支持Func<T>而不支持任何其他的Func仿製。

你可以註冊你想使用Unity的FUNC鍵,然後將它解析:

Func<SysConfig, IFileLoader> func = config => container.Resolve<IFileLoader>(); 
container.RegisterType<Func<SysConfig, IFileLoader>>(new InjectionFactory(c => func)); 

var processor = container.Resolve<IMyProcessor>(); 

還有一些其他的解決方案在那裏像這樣的:Unity's automatic abstract factory

+0

哇,作品!向你致敬! –

相關問題