2011-03-25 67 views
0

過去3年來,我一直是溫莎城堡IoC集裝箱;我正在嘗試使用Autofac進行概念驗證,並且無法在Autofac中找到等價的Windsor's Castle的功能。在Autofac尋找相當於溫莎城堡的功能

•在Windsor Castle的IWinsorContainer API中,有一個Release方法允許立即釋放組件實例。 Autofac容器中是否有等效的方法?

•溫莎城堡有一個「彙集」生活方式的概念,請參閱下面的鏈接。 Autofac中是否有等價物? http://www.castleproject.org/container/documentation/trunk/manual/coretypedocs/Generated_PooledAttribute.html

•溫莎城堡的DynamicProxy提供了一種方法攔截。我發現下面的鏈接,並遵循Nicholas的指令,但我無法在AutofacContrib.DynamicProxy2或他提到的源代碼中找到IInterceptor接口。 http://nblumhardt.com/archives/aop-with-autofac-and-dynamicproxy2/

我希望你能提供任何信息!

回答

4

Autofac中沒有明確的發佈。 Autofac中的組件生命週期由生命週期範圍管理。您可能最接近顯式釋放對象的方法是使用生命週期中固有的the IDisposable support

假設你有實現IDisposable一類和你進行註冊:

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeComponent>().As<IMyDependency>().InstancePerLifetimeScope(); 
var container = builder.Build(); 

如果創建從中解析組件壽命範圍,則壽命範圍配置時,如此,你的組件:

using(var lifetime = container.BeginLifetimeScope()) 
{ 
    var myThing = lifetime.Resolve<IMyDependency>(); 
    // myThing.Dispose() gets called at the end of the using 
} 

或者,你可以看看owned instances,在那裏你控制什麼時候IDisposable.Dispose()被調用。

Autofac中沒有相當於Pooled壽命。您可以選擇...

  • 每個依賴項:每次解析組件時創建一個新實例。
  • 每個生命週期範圍:爲每個擁有的生命週期範圍創建一個新的實例(就像你在上面的例子中看到的那樣)。
  • 單實例:只需創建一個。

有一篇關於the lifetime scopes available here的維基文章。

你也許可以做一些定製編碼來獲得彙集工作涉及定製IComponentLifetime實現創建和擴展IRegistrationBuilder所以你可以做這樣的事情......

builder.RegisterType<Foo>().As<IFoo>().PooledLifetime(32); 

...但我不不認爲這將是一線或兩線的事情。如果您最終創建它,請考慮提供回AutofacContrib。

IInterceptor接口位於Castle.Core.dll - Castle.DynamicProxy.IInterceptor - 不在AutofacContrib.DynamicProxy2中。