过去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/
我很感激您提供的任何信息!
答案 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中没有相当于合并的生命周期。您可以选择......
有一篇关于the lifetime scopes available here的维基文章。
您可以执行一些自定义编码,以便在创建自定义IComponentLifetime实现和IRegistrationBuilder扩展时使用池,以便您可以执行类似的操作...
builder.RegisterType<Foo>().As<IFoo>().PooledLifetime(32);
......但我不认为它会是一两线的事情。如果您最终创建它,请考虑回馈AutofacContrib。
IInterceptor接口位于Castle.Core.dll - Castle.DynamicProxy.IInterceptor中 - 不在AutofacContrib.DynamicProxy2中。