3

Возможно ли создать экземпляр типа, настроенного в UnityContainer, в конструкторе другого типа, настроенного в UnityContainer? С моим текущим решением, я получаюUnity IoC: «Операция может дестабилизировать время выполнения»

ResolutionFailedException:
Постановление зависимости не удалось, тип = "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. Есть ли другой способ передать загрузчик Factory в MyProcessor класс?

Спасибо!

ответ

5

Проблема в том, что автоматические фабрики Unity поддерживают только Func<T>, а не любые другие генераторы Func.

Вы можете зарегистрировать Func вы хотите с Unity, а затем она будет решена:

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

Wow, работает! Снимаю перед вами шляпу! –

Смежные вопросы