2

我在使用 Autofac(版本 3.0.2)的 Funcs 分辨率时遇到问题。为什么 Autofac 能够为它无法解析的类型返回 Funcs?似乎 Autofac 在执行 func 时进行依赖解析,这似乎不正确,应该在创建 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();
        }
    }

}
4

2 回答 2

2

根据这段代码,似乎这Func<>实际上是对Resolveusing的编译调用TypedParameter。由于在调用之前不会进行调用Func<>,因此无法检测调用是否有效并且可以映射参数。

我不确定 Autofac 是否提供了一种简单的方法来验证解决的可能性而无需实际解决——但这绝对不是一个常见的功能,因此Func<>不包括它也就不足为奇了。

但是,鉴于 Autofac 是开源的,如果您有兴趣,绝对可以考虑添加该功能。

于 2013-07-07T23:29:39.753 回答
1

让一个函数在运行时解决它的依赖关系是依赖注入和控制反转的定义。如果它不这样做,它就不是国际奥委会。

于 2013-07-07T22:49:25.643 回答