我有一个需要某个状态才能运行的MixIn。
我正在注册它..
container.Register(Component.For(Of ICat) _
.ImplementedBy(Of Cat) _
.LifeStyle.Transient _
.Proxy.MixIns(New MyMixin()))
当我调用container.Resolve(ICat)时,我找回了ICat的代理,它也实现了IMixin。
但是,如果我再次调用container.Resolve(ICat),我会获得ICat的新代理,但MyMixin是SAME实例。 (这是有道理的,因为我没有告诉容器以任何方式创建IMixin)
所以,IMixin是一个Singleton,尽管Component的生活方式是Transient。
如何通过Fluent界面告诉Windsor为组件创建一个新的MyMixIn实例?
答案 0 :(得分:1)
我想我已经解决了这个问题。
我没有使用 Proxy.Mixins ,而是创建了自定义激活器()
Public Class MixInActivator(Of T)
Inherits Castle.MicroKernel.ComponentActivator.DefaultComponentActivator
Public Sub New(ByVal model As Castle.Core.ComponentModel, ByVal kernel As Castle.MicroKernel.IKernel, ByVal OnCreation As Castle.MicroKernel.ComponentInstanceDelegate, ByVal OnDestruction As Castle.MicroKernel.ComponentInstanceDelegate)
MyBase.New(model, kernel, OnCreation, OnDestruction)
End Sub
Protected Overrides Function InternalCreate(ByVal context As Castle.MicroKernel.CreationContext) As Object
Dim obj As Object = MyBase.InternalCreate(context)
If GetType(T).IsAssignableFrom(obj.GetType) = False Then
Dim options As New Castle.DynamicProxy.ProxyGenerationOptions
Dim gen As New Castle.DynamicProxy.ProxyGenerator
options.AddMixinInstance(Kernel.Resolve(Of T))
obj = gen.CreateInterfaceProxyWithTarget(Model.Service, obj, options)
End If
Return obj
End Function
End Class
现在,组件就像这样注册了
container.Register(Component.For(Of ICat) _
.ImplementedBy(Of Cat) _
.LifeStyle.Is(Castle.Core.LifestyleType.Transient) _
.Activator(Of MixInActivator(Of IMixin)))
IMixin注册如下
container.Register(Component.For(Of IMixin) _
.ImplementedBy(Of MyMixin) _
.LifeStyle.Is(Castle.Core.LifestyleType.Transient) _
.Named("MyMixin"))
答案 1 :(得分:0)
我不确定它如何冒充温莎,但在DynamicProxy级别,每个代理类型都有mixin实例。因此,如果您正在创建自己的mixin实例,您也可能每次都生成一个新的代理类型。要绕过这一点,请在混合类型中覆盖Equals和GetHashCode。
但我可能不对,所以你可能想先确定一下。
答案 2 :(得分:0)
如果您将mixin注册为过时的生活方式,它将为每个组件创建一个新实例:
container.Register(
Component.For<ICat>().ImplementedBy<Cat>()
.LifestyleTransient()
.Proxy.MixIns(m => m.Component("mixin")),
Component.For<MyMixin>().LifestyleTransient().Named("mixin")
);