寻找与Autofac相同的Windsor Castle的特色

时间:2011-03-25 18:08:12

标签: autofac

过去3年来,我一直是Windsor Castle IoC容器;我正在尝试使用Autofac拼凑一个概念证明,并且无法在Autofac中找到相同的Windsor城堡功能。

•在Windsor Castle的IWinsorContainer API中,有一种Release方法允许立即释放组件实例。 Autofac容器中是否有等效的方法?

•温莎城堡有“混合”生活方式的概念,请参阅下面的链接。 Autofac中是否有等价物? http://www.castleproject.org/container/documentation/trunk/manual/coretypedocs/Generated_PooledAttribute.html

•Windsor Castle的DynamicProxy提供了一种方法拦截方法。我找到了下面的链接并遵循了Nicholas的指令,但我无法在AutofacContrib.DynamicProxy2或他提到的源代码中找到IInterceptor接口。 http://nblumhardt.com/archives/aop-with-autofac-and-dynamicproxy2/

我很感激您提供的任何信息!

1 个答案:

答案 0 :(得分: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
}

或者,您可以查看调用IDisposable.Dispose()时控制的owned instances

在Autofac中没有相当于合并的生命周期。您可以选择......

  • Per Dependency:每次解析组件时创建一个新实例。
  • 每个生命周期范围:为每个拥有的生命周期范围创建一个新实例(如上例所示)。
  • 单一实例:只需创建一个。

有一篇关于the lifetime scopes available here的维基文章。

您可以执行一些自定义编码,以便在创建自定义IComponentLifetime实现和IRegistrationBuilder扩展时使用池,以便您可以执行类似的操作...

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

......但我不认为它会是一两线的事情。如果您最终创建它,请考虑回馈AutofacContrib。

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