如何解决如何将参数从解析依赖项传递给 Autofac 模块
目前我有一个 autofac 模块,它接收一个字符串作为参数,该字符串来自另一个依赖项。
我试图使用下面的代码传递它,我的问题是:这是正确的方法还是有更好/改进的方法?
builder.RegisterBuildCallback(c =>
{
var configService = c.Resolve<IConfigurationService>();
var module = new LoggingModule(configService.GetConfigurationValue("LoggerName"));
module.Configure(c.ComponentRegistry);
});
解决方法
一般尽量避免构建回调,尝试在配置容器的基础上配置容器。老实说,我很惊讶这甚至可以工作,因为容器和注册表是 effectively immutable。
最好使用 lambda 注册来解决问题。由于我们不知道您的日志记录模块在做什么,所以现在假设是这样的:
public class LoggingModule
{
private readonly string _name;
public LoggingModule(string name)
{
this._name = name;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterInstance(new MyLogger(this._name));
}
}
即使不完全是这样,也很容易适应类似的东西 - 参数进入模块并被注册使用。
您可以将其移入注册本身并完全删除模块。
builder.Register(ctx =>
{
var configService = ctx.Resolve<IConfigurationService>();
var name = configService.GetConfigurationValue("LoggerName");
return new MyLogger(name);
}).SingleInstance();
这避免了“预先知道参数”,也避免了尝试重新配置容器。您仍然可以在 DI 中注册配置并根据需要进行解析。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。