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 回答