私は、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)
{
}
}
}