您如何使用RegisterFactory?

问题描述 投票:0回答:1

我在理解如何使用RegisterFactory时遇到问题。下面的代码在较旧的InjectionFactory上可以正常使用,但是当我尝试对RegisterFactory做同样的事情时遇到了问题。

在示例代码中,有一个使用RegisterFactory的未注释部分和使用InjectionFactory的注释部分。 InjectionFactory代码可以正常工作,但是RegisterFactory抛出ResolutionFailedException。Unity.ResolutionFailedException:'当前类型ConsoleApp1.IFoo是接口,无法构造。您是否缺少类型映射?

我做错了什么?

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();
        container.EnableDebugDiagnostic();

        container.RegisterType<IFoo, Foo1>("Foo1");
        container.RegisterType<IFoo, Foo2>("Foo2");

        container.RegisterType<MainViewModel>();

        // This does not work
        container.RegisterFactory<Func<string, IFoo>>((c, type, name) => c.Resolve<IFoo>(name));

        // This works
        //container.RegisterType<Func<string, IFoo>>(new InjectionFactory(
        //    ctx => new Func<string, IFoo>(name => container.Resolve<IFoo>(name))));


        var vm = container.Resolve<MainViewModel>();
    }
}

public class MainViewModel
{
    public MainViewModel(Func<string, IFoo> fooFactory)
    {
        var foo1 = fooFactory.Invoke("Foo1");
        var foo2 = fooFactory.Invoke("Foo2");
    }
}

public interface IFoo
{
    string Name { get; }
}

public class Foo1 : IFoo
{
    public string Name { get; set; }

    public Foo1()
    {
        Name = "Foo1";
    }
}

public class Foo2 : IFoo
{
    public string Name { get; set; }

    public Foo2()
    {
        Name = "Foo2";
    }
}
unity-container
1个回答
0
投票

如果您正在向RegisterFactory注册,则告诉Unity如何构造实例。但是Unity已经知道如何构造Foo1Foo2,因为您已经注册了它们。

您想要的是供[[you使用的工厂,这是RegisterType所做的,因此可以使用。

通常,这样的工厂会实现某些IFooFactory,因此使上下文更加明显。但是,只要注册Func<string, IFoo>仅使用一次,它当然也可以正常工作。
© www.soinside.com 2019 - 2024. All rights reserved.