0

私は、bbv EventBrokerExtension ライブラリを使用しているアプリケーションに取り組んでいます。私が達成しようとしているのは、コンテナーを介してインスタンス化されたインスタンスを EventBroker にユニティ登録させたいということです。UnityContainerExtension を介してこれを行い、IBuilderStrategy を実装する予定です。問題は、インターフェイスのメソッドがコンストラクターの各パラメーターに対して呼び出されるように見えることです。問題は、複数回登録されるオブジェクトを構築するときに Singleton インスタンスが解決される場合です。

たとえば、あなたが持っていたとします

class Foo(ISingletonInterface singleton){}
class Foo2(ISingletonInterface singleton){}

そして、あなたはユニティを介してそれらを解決します

var container = new UnityContainer();
container.AddNewExtension<EventBrokerWireupStrategy>();
container.RegisterInstance<IEventBroker>(new EventBroker());
container.RegisterInstance(new Singleton());
var foo = container.Resolve<Foo>();
var foo2 = container.Resolve<Foo2>();

次に、UnityContainerExtension は、同じシングルトン オブジェクトで postbuildup を呼び出します。UnityContainerExtension の単純な実装を次に示します。

using Microsoft.Practices.ObjectBuilder2;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.ObjectBuilder;
using bbv.Common.EventBroker;
using System.Collections.Generic;
namespace PFC.EventingModel.EventBrokerExtension
{
public class EventBrokerWireupExtension : UnityContainerExtension, IBuilderStrategy
{
    private IEventBroker _eventBroker;
    private List<object> _wiredObjects = new List<object>();

    public EventBrokerWireupExtension(IEventBroker eventBroker)
    {
        _eventBroker = eventBroker;
    }


    protected override void Initialize()
    {
        Context.Strategies.Add(this, UnityBuildStage.PostInitialization);
    }

    public void PreBuildUp(IBuilderContext context)
    {

    }

    public void PostBuildUp(IBuilderContext context)
    {
        if (!_wiredObjects.Contains(context.Existing))
        {
            _eventBroker.Register(context.Existing);
            _wiredObjects.Add(context.Existing);
        }
    }

    public void PreTearDown(IBuilderContext context)
    {

    }

    public void PostTearDown(IBuilderContext context)
    {

    }
}

}

4

1 に答える 1

1

さらに調査した結果、問題は EventBrokerExtension に関係しているようです。それらを特定の順序でサブスクライブすると、イベント ブローカーに登録されないものがあります。

アップデート:

bbv EventBroker ライブラリを使用しているときに他の誰かが同様の動作を目撃した場合に備えて、この質問を答えで非常に迅速に更新したかったのです。私が見た動作は、サブスクライバーがしばらくの間イベントを取得するが、その後イベントの受信を停止するというものでした。設計上、EventBroker は、登録されているパブリッシャーとサブスクライバーへの弱い参照のみを維持します。イベントブローカはオブジェクトを参照する唯一のクラスだったので、不確定な時間にガベージ コレクションが行われ、イベントを受信しなくなりました。解決策は、EventBroker 以外のアプリケーション内のどこかにハード リファレンスを作成することだけでした。

于 2013-01-10T00:36:59.630 に答える