[英]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.