3

是否可以在 UnityContainer 中配置的另一种类型的构造函数中实例化在 UnityContainer 中配置的类型?使用我目前的解决方案,我得到了一个

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 配置的 Main 函数:

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");
    }
}

我假设问题与传递给 MyProcessor 类的Func有关。还有另一种方法可以将loaderFactory传递给MyProcessor类吗?

谢谢!

4

1 回答 1

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

于 2013-10-26T05:52:27.173 回答