簡體   English   中英

如何從解析依賴項將參數傳遞給 Autofac 模塊

[英]How to pass parameter to an Autofac Module from a resolve dependency

目前我有一個 autofac 模塊,它接收一個字符串作為參數,並且該字符串來自另一個依賴項。

我試圖使用下面的代碼傳遞它,我的問題是:這是正確的方法還是有更好/改進的方法來做到這一點?

builder.RegisterBuildCallback(c =>
{
    var configService = c.Resolve<IConfigurationService>();
    var module = new LoggingModule(configService.GetConfigurationValue("LoggerName"));
    module.Configure(c.ComponentRegistry);
});

一般盡量避免構建回調,並嘗試在配置容器的基礎上配置容器。 老實說,我很驚訝這甚至可以工作,因為容器和注冊表實際上是不可變的。

最好使用 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 中注冊配置並根據需要解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM