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

C# 如果类型已注册,则不使用TypedParameter,c#,autofac,C#,Autofac,我在Autofac中遇到了类型参数的意外行为。如果类型已经是register,则忽略它,我不知道它是否正确,或者如何获得预期的行为。例如: 我有一个带有以下构造函数的Foo类 public class Foo { public Foo(IEnumerable<IRule> rules) {..} } 这里的问题是,Autofac忽略了myCustomListOfRules,并创建了一个列表,其中所有可用的IRules都已首先注册,而不是使用TypedParamete

我在Autofac中遇到了类型参数
的意外行为。如果类型已经是register,则忽略它,我不知道它是否正确,或者如何获得预期的行为。例如:

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

public class Foo
{
    public Foo(IEnumerable<IRule> rules)
    {..}
}
这里的问题是,Autofac忽略了myCustomListOfRules,并创建了一个列表,其中所有可用的
IRules
都已首先注册,而不是使用
TypedParameter

如果我使用
命名参数

 NamedParameter iocParam = new NamedParameter("rules", myCustomListOfRules);
工作正常,但我必须硬编码参数的名称,而不是按类型解析它

它是正确的
类型参数的行为
还是有一种方法可以使用它

更新:

我还做了一些不好的事情,因为
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
    {
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Autofac;
命名空间控制台应用程序3
{
班级计划
{
静态void Main(字符串[]参数)
{
ContainerBuilder=新的ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As();
RegisterType();
var resolver=builder.Build();
//autofac使用所有可用规则解析foo,好吗
var foo1=resolver.Resolve();
Console.WriteLine(foo1.GetNumberOfRules());
//用自定义规则解决,好吗
var规则=新列表();
添加(新规则1());
TypedParameter参数=新的TypedParameter(typeof(IEnumerable),规则);
var foo2=解析器.Resolve(param);
Console.WriteLine(foo2.GetNumberOfRules());
Console.ReadLine();
}
}
公开课Foo
{
可数规则;
公共Foo(IEnumerable规则)
{
这个。规则=规则;
}
public int GetNumberOfRules()
{
返回此.rules.Count();
}
}
公共接口病毒
{
}
公共类规则1:IRule
{
}
公共类规则2:IRule
{
}
}

我无法用Autofac v3.0.2或2.6.3.862重新编程。使用
TypedParameter
工作正常。你能用可编译/工作代码创建一个小程序吗?nemewsv,你说得对。我已经更新了一个显示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
    {
    }
}