Возможно ли создать экземпляр типа, настроенного в 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 класс?
Спасибо!
Wow, работает! Снимаю перед вами шляпу! –