Виндзорский MixIn - это синглтон? - PullRequest
0 голосов
/ 24 марта 2009

У меня есть 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 - это ЖЕ экземпляр. (Это имеет смысл, потому что я не сказал контейнеру никакого способа создания IMixin)

Итак, IMixin - это Синглтон, хотя образ жизни Компонента временный.

Как я могу сказать Windsor, хотя и через Fluent Interface, создать новый экземпляр MyMixIn для компонента?

Ответы [ 2 ]

1 голос
/ 25 марта 2009

Кажется, я решил это.

Вместо использования 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"))
0 голосов
/ 25 марта 2009

Я не уверен, как это пузыри до Виндзора, но на уровне DynamicProxy, есть экземпляр Mixin для каждого типа прокси. Так что, если вы создаете сами миксины, вы также можете каждый раз генерировать новый тип прокси. Чтобы обойти это, переопределите Equals и GetHashCode в вашем смешанном типе.

Однако я могу быть не прав, поэтому вы можете сначала убедиться.

...