我想在運行時用ASP.NET MVC應用程序中的新實例替換Autofac中的現有註冊實例。在我處理不同子類型實例的集合時,註冊是關鍵的,儘管它似乎與我的問題無關。如何在運行時更新Autofac容器中的註冊實例
在應用程序啓動的初始登記
foreach (var instance in instances)
{
builder.RegisterInstance(instance).Keyed<IInstance>(InstanceType.A);
}
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
此外上,在一個控制器的方法i執行以下操作:處理舊的情況下,獲得新的,創建一個新的助洗劑,重新註冊的現有組件,並且還註冊新的情況下,然後更新Autofac的ComponentContext
//...dispose old instances, obtain new instances
var builder = new ContainerBuilder();
foreach (var c in _componentContext.ComponentRegistry.Registrations)
{
builder.RegisterComponent(c);
}
foreach (var instance in newInstances)
{
builder.RegisterInstance(instance).Keyed<IInstance>(InstanceType.A);
}
builder.Update(_componentContext.ComponentRegistry);
下一次我進入控制方法,在控制器構造函數中的舊實例解析爲IIndex<InstanceType, IInstance[]>
,而不是新的。我究竟做錯了什麼?
這感覺就像是一個壞主意,我。爲什麼不註冊一個可以容納和更改引用的對象?如果您在您的[組合根目錄](http://stackoverflow.com/questions/6277771/what-is-a-composition-root-in-the-context-of-dependency-injection)之外使用您的容器應用程序,那麼這是一種代碼味道。 –
我完全同意@SamHolder:這樣做是一種可怕的做法。這是複雜的,容易出錯的,性能沉重,以及維護的噩夢。如果你解釋你試圖完成的是什麼(你爲什麼要替換註冊),我們可能會給出一些反饋意見並展示更好的方法。 – Steven
@SamHolder和Steven:是的,我知道代碼味道很糟糕,儘管我很好奇爲什麼組件上下文更新不起作用。 實例是MassTransit服務總線,我需要保持對象引用能夠正確關閉它們並按需獲取診斷數據。在刷新行動後,巴士的配置可能會改變,因此我必須關閉舊巴士並開始新巴士。無論如何,最好的方法似乎是使用一種對象提供者來保持對可用服務總線的引用。 – jjjjj