2013-05-08 39 views
6

我正在修改現有代碼庫以更好地使用autofac容器。我遇到的情況是,很多東西用於從經典的ServiceLocator反模式的容器中直接解析它們的組件。我正在使用LifetimeScope介紹適當的工作單元方案。檢查組件在最外層是否已解析LifetimeScope

我面臨的問題是,某些組件必須從子項LifetimeScope中解析出來,因爲它們正在實施IDisposable並且必須予以處置。如果他們在永遠不會發生的根作用域中解決。

有什麼辦法可以防止某些組件在根作用域中被解析嗎?對此,Crashing運行時是可以的,因爲我正在逐一處理這些情況,並根據需要引入範圍。我能想到的唯一方法就是創建一個虛構的組件,爲根生存期範圍解決一次,並在.InstancePerLifetimeScope()中解決,將其靜態存儲在某處。然後,當解析後面的組件時,我會得到其中一個虛擬組件,並查看它是否與根作用域中的生命組件相同。這有點笨重,還有更好的方法嗎?

回答

1

你可以嘗試使用「每匹配一生範圍」註冊:

containerBuilder.RegisterType<Foo>() 
       .As<IFoo>() 
       .InstancePerMatchingLifetimeScope("scope"); 

這樣IFoo當至少一個祖先的壽命範圍是一個標記壽命範圍和它的標籤等於"scope"才能解決。根壽命範圍通常不會被標記,因此當您嘗試從中解析IFoo時,Autofac將拋出異常。

請參閱the Autofac wiki瞭解更多信息。