我正在尝试将 SimpleInjector 作为 IOC 容器开始使用,到目前为止我对它非常满意。但是现在我被困在一个我无法解决的问题上。我在 SO 和文档中进行了搜索,但似乎还没有答案。我已经看过SimpleInjector 的 howto 文档,但这不包括开放的通用接口。
我有两个像这样的通用接口:
public interface IEventPublisher<TEvent>
{
void Publish(TEvent Event);
}
public interface IEventSubscriber<TEvent>
{
void Subscribe(Action<TEvent> CallBack);
}
以及这两者的一个开放通用实现:
class EventMediator<T> : IEventPublisher<T>, IEventSubscriber<T>
{
List<Action<T>> Subscriptions = new List<Action<T>>();
public void Publish(T Event)
{
foreach (var Subscription in this.Subscriptions)
Subscription.Invoke(Event);
}
public void Subscribe(Action<T> CallBack)
{
this.Subscriptions.Add(CallBack);
}
}
在我的应用程序中,我正在像这样设置 SimpleInjector:
this.Container = new SimpleInjector.Container();
this.Container.RegisterOpenGeneric(typeof(IEventPublisher<>), typeof(EventMediator<>), Lifestyle.Singleton);
this.Container.RegisterOpenGeneric(typeof(IEventSubscriber<>), typeof(EventMediator<>), Lifestyle.Singleton);
this.Container.Verify();
我要存档的是:我希望在请求 IEventPublisher 或 IEventSubscriber 时获得完全相同的实例。此外,这个 Instance 应该是任何 T 的单例。
我已经用这些线测试了这个:
class DummyEvent {}
var p = this.Container.GetInstance<IEventPublisher<DummyEvent>>();
var s = this.Container.GetInstance<IEventSubscriber<DummyEvent>>();
var areSame = (object.ReferenceEquals(p,s));
不幸的是 p 和 s 不是指同一个实例。有人碰巧知道这个问题的解决方案吗?