2

Autofac (バージョン 3.0.2) の Funcs の解像度に問題があります。Autofac が解決できない型の Funcs を返すことができるのはなぜですか? 関数の実行時にAutofacが依存関係の解決を行っているようですが、これは正しくないようで、関数の作成時に実行する必要があります(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

このコードによると、実際にはusingFunc<>へのコンパイル済みの呼び出しのようです。を呼び出すまで呼び出しが行われないため、呼び出しが有効かどうか、およびパラメーターをマップできるかどうかを検出できません。ResolveTypedParameterFunc<>

Autofac が、実際に解決せずに解決の可能性を検証する簡単な方法を提供するかどうかはわかりませんが、これは一般的な機能ではないことは間違いないため、それがFunc<>含まれていないことは驚くべきことではありません。

ただし、Autofac はオープン ソースであるため、興味がある場合は、その機能を追加することを検討できます。

于 2013-07-07T23:29:39.753 に答える
1

関数が実行時にその依存関係を解決することは、依存関係の注入と制御の反転の定義です。これをしなければ、IOC にはなりません。

于 2013-07-07T22:49:25.643 に答える