如何将参数从解析依赖项传递到 Autofac 模块

How to pass parameter to an Autofac Module from a resolve dependency

目前我有一个 autofac 模块,它接收一个字符串作为参数,并且该字符串来自另一个依赖项。

我正在尝试使用以下代码传递它,我的问题是:这是正确的方法还是有 better/improved 方法可以做到这一点?

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 中注册配置并根据需要解决它。