我使用Autofac和我有几类,其请求字符串类型和名称郎的参数。 是否有注册一个字符串值,命名为“郎”的所有参数的方式,因此它会自动解决? 我不想编辑任何构造的,因为它不是我的代码(我知道接受如的CultureInfo将使登记容易..)
导致像builder.Register短语法东西(郎=> “的en-US”)。作为()。命名( “郎”)
是理想的。
谢谢。
我使用Autofac和我有几类,其请求字符串类型和名称郎的参数。 是否有注册一个字符串值,命名为“郎”的所有参数的方式,因此它会自动解决? 我不想编辑任何构造的,因为它不是我的代码(我知道接受如的CultureInfo将使登记容易..)
导致像builder.Register短语法东西(郎=> “的en-US”)。作为()。命名( “郎”)
是理想的。
谢谢。
为了解决这方面的一个相当简单的方法是使用自定义Autofac模块。
首先,实现模块和处理IComponentRegistration.Preparing事件。 这也是在这里您可以存储您的参数值:
using System;
using Autofac;
using Autofac.Core;
public class LangModule : Module:
{
private string _lang;
public LangModule(string lang)
{
this._lang = lang;
}
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
// Any time a component is resolved, it goes through Preparing
registration.Preparing += InjectLangParameter;
}
protected void InjectLangParameter(object sender, PreparingEventArgs e)
{
// Add your named parameter to the list of available parameters.
e.Parameters = e.Parameters.Union(
new[] { new NamedParameter("lang", this._lang) });
}
}
现在,你有你的自定义模块,你可以沿着与其他依赖其注册,并提供你想要注入的价值。
var builder = new ContainerBuilder();
builder.RegisterModule(new LangModule("my-language"));
builder.RegisterType<LangConsumer>();
...
var container = builder.Build();
现在,当你解决了一个字符串参数的任何类型的“郎”你的模块将插入你所提供的价值。
如果您需要更具体的,你可以使用PreparingEventArgs在事件处理程序,以确定事情像这类型被解析( e.Component.Activator.LimitType
),等等,那么你可以在飞行中决定是否要包括你的参数。
看看这个例子:
builder.Register<ClassName>((c, p) =>
{
var p2 = p.Named<string>("lang");
return new ClassName(p2);
});
var container = builder.Build();
var m = container.Resolve<ClassName>(new NamedParameter("lang", "en-US"));
var m2 = container.Resolve<ClassName>(new NamedParameter("lang", "fr-FR"));
你可以解决您的类,并在构造函数传递参数。