我在理解如何使用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";
}
}
如果您正在向RegisterFactory
注册,则告诉Unity如何构造实例。但是Unity已经知道如何构造Foo1
和Foo2
,因为您已经注册了它们。
您想要的是供[[you使用的工厂,这是RegisterType
所做的,因此可以使用。
IFooFactory
,因此使上下文更加明显。但是,只要注册Func<string, IFoo>
仅使用一次,它当然也可以正常工作。