0

動作するためにいくつかの状態を必要とする MixIn があります。

そのまま登録してます..

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

container.Resolve(of ICat) を呼び出すと、IMixin も実装する ICat のプロキシが返されます。

ただし、container.Resolve(of ICat) を再度呼び出すと、ICat の新しいプロキシが取得されますが、MyMixin は同じインスタンスです。(IMixin を作成する方法をコンテナに伝えていないので、これは理にかなっています)

したがって、コンポーネントのライフスタイルが一時的であっても、IMixin はシングルトンです。

コンポーネントの MyMixIn の新しいインスタンスを作成するように、Fluent Interface を使用して Windsor に指示するにはどうすればよいですか?

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レベルでは、プロキシタイプごとにミックスインインスタンスがあります。したがって、ミックスインインスタンスを自分で作成している場合は、毎回新しいプロキシタイプを生成している可能性があります。これを回避するには、混合型のEqualsとGetHashCodeをオーバーライドします。

しかし、私は正しくないかもしれないので、最初に確認することをお勧めします。

于 2009-03-25T16:21:16.707 に答える