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