1

TypedParameter我在 Autofac 中有一个意想不到的行为。如果类型已经注册并且我不知道它是否正确或如何获得预期的行为,它会被忽略。例子:

我有一个Foo带有以下构造函数的类。

public class Foo
{
    public Foo(IEnumerable<IRule> rules)
    {..}
}

我已经在构建器中注册了很多规则(扫描程序集),但是当我解决时,我想传递一个TypedParameter带有自定义列表的AutofacIRules

TypedParameter iocParam = new TypedParameter(typeof(IEnumerable<IRule>), rules);
var result = container.Resolve(FOO, iocParam);

这里的问题是 Autofac 忽略 myCustomListOfRules 并创建一个列表,其中包含所有可用的IRules已经注册的列表,而不是使用TypedParameter.

如果我使用NamedParameter

 NamedParameter iocParam = new NamedParameter("rules", myCustomListOfRules);

工作正常,但我必须硬编码参数的名称,而不是按类型解析它。

是正确的行为TypedParameter还是有办法按照我的意愿使用它?

更新:

我正在做其他不好的事情,因为它TypedParameter具有预期的行为。以下示例按预期工作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autofac;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<Rule1>().As<IRule>();
            builder.RegisterType<Rule2>().As<IRule>();
            builder.RegisterType<Foo>();

            var resolver=builder.Build();

            // autofac resolve foo with all of available rules, ok¡
            var foo1=resolver.Resolve<Foo>();
            Console.WriteLine(foo1.GetNumberOfRules());

            // resolve with custom rules, ok¡
            var rules=new List<IRule>();
            rules.Add(new Rule1());
            TypedParameter param = new TypedParameter(typeof(IEnumerable<IRule>), rules);
            var foo2 = resolver.Resolve<Foo>(param);
            Console.WriteLine(foo2.GetNumberOfRules());

            Console.ReadLine();
        }
    }

    public class Foo
    {
        IEnumerable<IRule> rules;
        public Foo(IEnumerable<IRule> rules)
        {
            this.rules = rules;
        }

        public int GetNumberOfRules()
        {
            return this.rules.Count();
        }
    }

    public interface IRule
    {
    }

    public class Rule1 : IRule
    {
    }

    public class Rule2 : IRule
    {
    }
}
4

0 回答 0