Próbuję zacząć od SimpleInjector jako kontenera IOC i do tej pory jestem z niego całkiem zadowolony. Ale teraz utknąłem na problemie, którego nie mogę rozwiązać. Szukałem w SO i dokumentacji, ale wydaje się, że nie otrzymałem jeszcze odpowiedzi. Widziałem the howto doc from SimpleInjector, ale to nie obejmuje otwartych interfejsów ogólnych.SimpleInjector HowTo Rejestracja wielu otwartych interfejsów ogólnych do implementacji jednoogólnej
Mam dwa interfejsy generyczne, takie jak:
public interface IEventPublisher<TEvent>
{
void Publish(TEvent Event);
}
public interface IEventSubscriber<TEvent>
{
void Subscribe(Action<TEvent> CallBack);
}
i jeden otwarty rodzajowe realizację tych dwóch:
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);
}
}
W mojej aplikacji mam ustanowienia SimpleInjector tak:
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();
To, co próbuję archiwizować, to: ke, aby uzyskać dokładnie to samo wystąpienie, gdy poprosimy o IEventPublisher lub IEventSubscriber. A ponadto tym przypadku powinna być pojedyncza dla każdego T.
mam przetestowane z tych linii:
class DummyEvent {}
var p = this.Container.GetInstance<IEventPublisher<DummyEvent>>();
var s = this.Container.GetInstance<IEventSubscriber<DummyEvent>>();
var areSame = (object.ReferenceEquals(p,s));
Niestety p i s nie odnoszą się do tej samej instancji. Czy zdarzyło się, że ktoś zna rozwiązanie tego problemu?
Witaj Steven, dziękuję bardzo. To faktycznie działa i rozwiązuje mój problem, chociaż wyobrażałem sobie, że będzie sposób archiwizowania tego bez tworzenia oddzielnych implementacji. – Kai
Cudowne, okrzyki za aktualizację – Kai
@ka: ale zauważ, że zgadzam się z Qujck na temat rozdziału w twoim projekcie. Myślę, że twój projekt poprawia się wraz z jego sugestią. – Steven