如果类型已经注册,则不使用TypedParameter

时间:2013-07-26 16:20:52

标签: c# autofac

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

我有一个Foo类,其中包含以下构造函数。

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

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

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
    {
    }
}

0 个答案:

没有答案