我遇到了Autofac(版本3.0.2)Funcs分辨率的问题。为什么Autofac能够为无法解析的类型返回Func?执行func时,似乎Autofac正在执行依赖项解析,这似乎是错误的,应该在创建Func时完成(不创建Foo
类型,但确保可以使用已知的已注册类型调用其构造函数)。
using System;
using Autofac;
using NUnit.Framework;
namespace AutofacTest
{
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Foo>().AsSelf().AsImplementedInterfaces();
var container = builder.Build();
//var foo = container.Resolve<IFoo>(); //Throws because the int arg can't be resolved (as it should)
Assert.True(container.IsRegistered<Func<int, IFoo>>()); //This is valid and makes sense
var fooFunc = container.Resolve<Func<int, IFoo>>();
var foo = fooFunc(9);
//Assert.False(container.IsRegistered<Func<string, IFoo>>()); //Why is this true?
var badFooFunc = container.Resolve<Func<string, IFoo>>(); // Why doesn't Autofac throw here?
var badFoo = badFooFunc(string.Empty); // Autofac throws here
}
}
interface IFoo { }
public class Foo : IFoo
{
public string ArgStr { get; set; }
public Foo(int arg)
{
this.ArgStr = arg.ToString();
}
}
}
答案 0 :(得分:2)
根据this code,似乎Func<>
实际上是使用Resolve
对TypedParameter
的编译调用。由于在您调用Func<>
之前未进行调用,因此无法检测调用是否有效以及是否可以映射参数。
我不确定Autofac是否提供了一种简单的方法来验证解析的可能性而无需实际解决 - 但这绝对不是一个常见的功能,所以Func<>
不包括它就不足为奇了。
但是,鉴于Autofac是开源的,如果您感兴趣,可以考虑添加该功能。
答案 1 :(得分:1)
在运行时使用函数解析它的依赖关系是依赖注入和控制反转的定义。如果没有这样做,就不会是IOC。