7

Wyobraźmy mam poniżej:Rejestrowanie pojedyncza poprzez SimpleInjector i powrót tego samego wystąpienia, dla różnych interfejsów realizuje

public interface IocInterface1 { } 

public interface IocInterface2 { } 

public class IocImpl : IocInterface1, IocInterface2 { } 

chciałbym że jeśli staram się uzyskać jakiekolwiek wystąpienie powyższych klas/interfejsów poprzez IoC, otrzymuję dokładnie to samo wystąpienie, a nie jeden singleton na typ. Przykład, b1 i b2 poniżej powinny być prawdziwe:

_container.RegisterSingle<IocInterface1, IocImpl>(); 
_container.RegisterSingle<IocInterface2, IocImpl>(); 
_container.RegisterSingle<IocImpl, IocImpl>(); 

var test1 = _container.GetInstance<IocInterface1>(); 
var test2 = _container.GetInstance<IocInterface2>(); 
var test3 = _container.GetInstance<IocImpl>(); 

bool b1 = test1 == test2; 
bool b2 = test2 == test3; 

Czy to możliwe?

Odpowiedz

10

Jeśli chcesz zarejestrować wiele typów z tą samą rejestracją, potrzebujesz pojedynczego obiektu rejestracji dla swojego typu wdrożenia IocImpl.

Wtedy trzeba użyć AddRegistration aby dodać rejestracji dla poszczególnych usług: IocInterface1, IocInterface2 itp .:

var _container = new Container(); 
var registration = 
    Lifestyle.Singleton.CreateRegistration<IocImpl, IocImpl>(_container); 

_container.AddRegistration(typeof(IocImpl), registration); 
_container.AddRegistration(typeof(IocInterface1), registration); 
_container.AddRegistration(typeof(IocInterface2), registration); 

jak opisano w documenation: Register multiple interfaces with the same implementation

Alternatywnie, można również zrobić mapowanie za pomocą delegatów:

_container.RegisterSingle<IocImpl>(); 
_container.RegisterSingle<IocInterface1>(() => container.GetInstance<IocImpl>()); 
_container.RegisterSingle<IocInterface2>(() => container.GetInstance<IocImpl>()); 

W większości przypadków oba egzaminy ples są funkcjonalnie równoważne, ale preferowany jest pierwszy.

+0

To wygląda dobrze na to, czego potrzebuję - czy jednak uwzględnia on również 'container.RegisterSingleOpenGeneric()'? Powodem jest to, że mam skaner montażowy, który skanuje wszystkie typy, które ja dekoruję atrybutem niestandardowym. Stworzyłem '[IocComponent]', a to również obsługuje open-generics. –

+0

'RegisterSingleOpenGeneric' działa trochę inaczej, ponieważ tworzy rejestrację w locie w zdarzeniu' ResolveUnregisteredType' ... Muszę się zastanowić, jak można to zrobić bez zastępowania logiki metody "RegisterSingleOpenGeneric". Ale myślę, że powinieneś zadać to pytanie uzupełniające, w którym podajesz szczegółowe informacje o tym, jak działa skanowanie i jak próbuje zarejestrować typy ogólne. – nemesv

+0

Zgadzam się z @nemesv: proszę zadać nowe pytanie z tymi szczegółami. Ta odpowiedź jest poprawna. +1 za to. – Steven

Powiązane problemy