我正在使用 Autofac,并且我有几个类要求输入字符串类型和名称 lang 的参数。有没有办法为所有名为“lang”的参数注册一个字符串值,所以它会自动解析?我不想编辑任何构造函数,因为它不是我的代码(我知道接受例如 CultureInfo 会使注册变得容易..)
导致语法短的东西,如 builder.Register(lang => "en-US").As().Named("lang")
将是理想的。
谢谢你。
我正在使用 Autofac,并且我有几个类要求输入字符串类型和名称 lang 的参数。有没有办法为所有名为“lang”的参数注册一个字符串值,所以它会自动解析?我不想编辑任何构造函数,因为它不是我的代码(我知道接受例如 CultureInfo 会使注册变得容易..)
导致语法短的东西,如 builder.Register(lang => "en-US").As().Named("lang")
将是理想的。
谢谢你。
解决这个问题的一个相当简单的方法是使用自定义 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();
现在,当您解析任何具有字符串参数“lang”的类型时,您的模块将插入您提供的值。
如果您需要更具体,您可以使用事件处理程序中的 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"));
您可以解析您的类并在构造函数中传递参数。