Sto cercando di iniziare con SimpleInjector come contenitore IOC e fino ad ora sono abbastanza soddisfatto. Ma in questo momento sono bloccato su un problema che non riesco a risolvere. Ho cercato su SO e nella documentazione, ma sembra che non ci sia ancora risposta. Ho visto the howto doc from SimpleInjector ma questo non copre le interfacce generiche aperte.SimpleInjector HowTo Registrazione di più interfacce generiche aperte per una singola implementazione generica
Ho due interfacce generiche come questi:
public interface IEventPublisher<TEvent>
{
void Publish(TEvent Event);
}
public interface IEventSubscriber<TEvent>
{
void Subscribe(Action<TEvent> CallBack);
}
E uno aperto implementazione generica per quei due:
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);
}
}
nella mia applicazione Sono la creazione di SimpleInjector come questo:
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();
Quello che sto cercando di archiviare è: I'd li per ottenere esattamente la stessa istanza quando si richiede un IEventPublisher o un IEventSubscriber. E inoltre questo grado è un Singleton per qualsiasi T.
Ho provato questo con queste righe:
class DummyEvent {}
var p = this.Container.GetInstance<IEventPublisher<DummyEvent>>();
var s = this.Container.GetInstance<IEventSubscriber<DummyEvent>>();
var areSame = (object.ReferenceEquals(p,s));
p e s Purtroppo non si riferiscono alla stessa istanza. Qualcuno capita di sapere una soluzione a questo problema?
Ciao Steven, grazie mille. Questo in realtà funziona e risolve il problema anche se avevo immaginato che sarebbe stato possibile archiviarlo senza creare implementazioni separate. – Kai
meraviglioso, evviva l'aggiornamento – Kai
@ka: ma nota che sono d'accordo con Qujck sulla separazione nel tuo progetto. Penso che il tuo design migliori con il suo suggerimento. – Steven