Próbuję Ninject i modyfikuję kod, który napisałem z Mapą Struktury, aby zobaczyć, jak łatwo jest. W tym kodzie podstawowym mam wykres obiektów, które mają różne konfiguracje za pośrednictwem rejestrów mapy struktury, a ten, który ma być użyty, jest wybierany w czasie wykonywania przez wartość w bazie danych (w tym przypadku, aby wycofać ciało usługi wcf z zastrzykami niektórych obiektów) . Na przykład (przy użyciu kodu mapy struktury):Używanie nazw do rozróżniania instancji za pomocą IoC
Rejestr 1 ustawia wszystkie wartości domyślne dla typów IBusinessContext, IRules i ILogger. To jest po prostu dodanie typów GenericContext/Logger/Rules obok interfejsów bez żadnej specjalności.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
Registry 2 ustanawia IBusinessContext użyć klasy SpecialisedContext i opowiada konstruktor korzystania SpecializedLogger. Instancja dla IBusinessContext nosi nazwę "SpecializedContext".
public SpecializedRegistry()
{
// Old style syntax as it affects the default for IBusinessContext
// Perhaps a hint at what I'm doing?
InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
}
Wszystko działa zgodnie z oczekiwaniami w Mapie konstrukcji (w zależności od starej lub nowej składni).
Jednak, gdy używam programu Ninject, natrafiłem na problem z oczekiwaniem, że instancja nienazwana będzie domyślna (a nie jak działa Ninject, rozumiem). Doprowadziło to do pewnych badań, które zasugerowały, że używanie nazwanych wystąpień to naprawdę zły pomysł. Rozumiem, że istnieją lepsze sposoby, aby to zrobić za pomocą automatycznej rejestracji lub atrybutów, aby ustawić nazwę lub zażądać określonego typu, ale w systemie, który opisuję, musi istnieć sposób w czasie wykonywania, aby dowiedzieć się, o którą konfigurację poprosić. w górnej części drzewa (i niech struktura IoC oblicza resztę na podstawie zarejestrowanych typów lub reguł).
Więc ... czy używam tutaj koncepcji IoC nie tak, oczekując, że poprosię o mój obiekt najwyższego poziomu po imieniu, czy ogólnie jest lepszy sposób na robienie tego, co próbuję zrobić? Czy zamiast tego powinienem używać czegoś takiego jak MEF i traktować to wszystko jak wtyczki?
Podkreślam, że nie używam tego jako głupiej fabryki i pytam na każdym poziomie kodu dla instancji typu x z kontenera, to tylko działanie inicjujące.
góry dzięki za poświęcony czas i pomoc :)
Dzięki Aaron! To wyjaśniło mi kilka rzeczy :) Jest to bardzo doceniane. – NoodleAwa