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