Pergunta

Eu tenho um MixIn que requer algum estado de operar.

Eu estou registrando-o como assim ..

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

Quando eu chamo container.Resolve (de ICAT), eu voltar um proxy para iCat, que também implementa IMixin.

No entanto, se eu chamar container.Resolve (de ICAT) novamente, eu recebo um novo proxy para ICAT, mas MyMixin é a instância MESMO. (O que faz sentido, porque eu não disse ao contentor, qualquer forma de criar IMixin)

Assim, IMixin é um Singleton, embora estilo de vida do componente é transitória.

Como posso saber Windsor, embora a interface fluente, para criar uma nova Instância de MyMixIn para o componente?

Foi útil?

Solução

Eu acho que eu resolvi isso.

Em vez de usar Proxy.Mixins , eu criei um costume 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

Então, agora, o componente está registrado como esta

 container.Register(Component.For(Of ICat) _
                     .ImplementedBy(Of Cat) _
                     .LifeStyle.Is(Castle.Core.LifestyleType.Transient) _
                     .Activator(Of MixInActivator(Of IMixin)))

E IMixin é registrado como segue

container.Register(Component.For(Of IMixin) _
                       .ImplementedBy(Of MyMixin) _
                       .LifeStyle.Is(Castle.Core.LifestyleType.Transient) _
                       .Named("MyMixin"))

Outras dicas

Eu não tenho certeza como ele bolhas até Windsor, mas a nível DynamicProxy, há Instância mixin por tipo de proxy. Então, se você está criando-se mixin casos, você pode ser também cada vez estar gerando um novo tipo de proxy. Para contornar isso, substituir Equals e GetHashCode em sua misto no tipo.

I podem, contudo, não estar certo, então você pode querer certificar-se em primeiro lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top