0

我有一个 MixIn 需要一些状态才能运行。

我是这样注册的。。

    container.Register(Component.For(Of ICat) _
                        .ImplementedBy(Of Cat) _
                        .LifeStyle.Transient _
                        .Proxy.MixIns(New MyMixin()))

当我调用 container.Resolve(of ICat) 时,我得到了 ICat 的代理,它也实现了 IMixin。

但是,如果我再次调用 container.Resolve(of ICat),我会得到一个新的 ICat 代理,但 MyMixin 是相同的实例。(这是有道理的,因为我没有告诉容器以任何方式创建 IMixin)

所以,IMixin 是一个 Singleton,尽管组件的生活方式是 Transient。

我如何通过 Fluent Interface 告诉 Windsor 为组件创建一个新的 MyMixIn 实例?

4

3 回答 3

1

我想我解决了这个问题。

我没有使用Proxy.Mixins,而是创建了一个自定义Activator ()

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"))
于 2009-03-25T15:56:31.557 回答
0

我不确定它是如何冒泡到 Windsor 的,但在 DynamicProxy 级别,每个代理类型都有 mixin Instance。因此,如果您正在创建自己的 mixin 实例,您也可能每次都在生成新的代理类型。为了避免这种情况,请在您的混合类型中覆盖 Equals 和 GetHashCode。

但是,我可能不对,因此您可能需要先确定一下。

于 2009-03-25T16:21:16.707 回答
0

如果您使用 transcient Lifestyle 注册 mixin,它将为每个组件创建一个新实例:

container.Register(
    Component.For<ICat>().ImplementedBy<Cat>()
        .LifestyleTransient()
        .Proxy.MixIns(m => m.Component("mixin")),
    Component.For<MyMixin>().LifestyleTransient().Named("mixin")
);
于 2020-03-23T19:33:02.057 回答