DI / IoC Container LightCore Teil 3: Registrierung von Generics

Im dritten Teil der Post Serie wird die bisher angewandte drei Schichten Struktur etwas erweitert, sodass diese durch das hinzufügen von generischen Klassen etwas mehr flexibel wird.
1. LightCore – Einführung2. LightCore – Registrierung über Xml Module3. LightCore – Registrierung von GenericsGenerics sind nichts anderes als Klassen, bei denen der Nutzer die Datentypen, die der Typ verarbeiten soll, vorgeben kann.
Es kann durchaus Sinn machen, bei Projekten die Repositories generisch zu halten, da sich diese immer auf dieselbe Datenquelle beziehen(bspw. bei Verwendung des NHibernate OR-Mappers) und sie sich lediglich von den angeforderten Typen unterscheiden.
LightCore bietet
zwei Möglichkeiten, generische Typen zu registrieren.
Closed TypesEine generische Klasse, die schon einen Typparameter hat.
IRepository<User> zu Repository<User> registrieren.
Die Registrierung und Auflösung sieht in dem Fall so aus:
builder.Register<IRepository<User>, Repository<User>();
container.Resolve<IRepository<User>>();Der
Nachteil dieser Variante liegt darin, dass jedes Repository getrennt registriert werden muss (eines für den User, eines für die UserGroup…). Dies wär in dem Fall suboptimal, da sie von den Funktionen her identisch sind.
Open TypesEine generische Klasse, die keinen bestimmten Parameter hat.
Der Kontrakt, in dem Fall IRepository<> hätte die Implementation Repository<>.
Der Vorteil dabei ist die Auflösung (on-the-fly) auf einem beliebigen Typparameter.
So wäre IRepository<User> und IRepository<UserGroup>.
In dem Fall muss das Repository nur
ein einziges Mal registrieren werden und kann mit beliebigem Typ auflöst werden.
Wenn das Projekt ein generisches Repository mit viele verschiedene Typen dazu hat, ist der open type die erste Wahl.
Als Beispiel wird wieder eine Solution mit einer klassischen drei Schichten Architektur verwendet.
Um das Ganze noch etwas zu vertiefen wird eine vierte Schicht „Core“ hinzugefügt. Diese beinhaltet die zentralen Interfaces wie bspw. IRepository oder IService.

Das Repository muss wie oben beschrieben nur einmal registriert werden:
container.Register(typeof(IRepository<>), typeof(Repository<>));Jetzt könnten alle gewünschten Typen (Im Beispiel user und usergroup) instanziiert werden:
container.resolve<IRepository<User>>();
container.resolve<IRepository<UserGroup>>();Fazit:Durch die Unterstützung von generischen Klassen ist Lightcore für mich interessant gewordern und ist bereits in einer Anwendung im Einsatz. Es funktioniert bis dato Problemfrei und ohne merkbare Performance Verluste. Es bietet genau das, was ich zur Zeit benötige. Somit bin ich gespannt auf dessen zukünftige Erweiterungen.
Anbei wie immer das Beispiel nicht vergessen! :-)