<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Roberto's Blog : IoC, LightCore</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/tags/IoC/LightCore/default.aspx</link><description>Ordnungsbegriffe: IoC, LightCore</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>DI / IoC Container LightCore Teil 3: Registrierung von Generics</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-generics.aspx</link><pubDate>Sun, 21 Feb 2010 17:18:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:216097</guid><dc:creator>Roberto</dc:creator><slash:comments>2</slash:comments><comments>http://www.aspnetzone.de/blogs/robertobez/comments/216097.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/robertobez/commentrss.aspx?PostID=216097</wfw:commentRss><description>&lt;img alt="LightCore Generics Registration" src="http://11249.2.sihosting.net/Blog/Images/LightCoreGeneric.gif" style="margin-right:5px;margin-bottom:5px;margin-top:5px;float:left;"&gt;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.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx" title="LightCore - Einführung"&gt;1. LightCore – Einführung&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-xml-module.aspx" title="LightCore - Registrierung über Xml Module"&gt;2. LightCore – Registrierung über Xml Module&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-generics.aspx" title="LightCore - Registrierung von Generics"&gt;3. LightCore – Registrierung von Generics&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://msdn.microsoft.com/de-de/library/sz6zd40f.aspx"&gt;Generics&lt;/a&gt; sind nichts anderes als Klassen, bei denen der Nutzer die Datentypen, die der Typ verarbeiten soll, vorgeben kann.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;LightCore bietet &lt;u&gt;zwei Möglichkeiten&lt;/u&gt;, generische Typen zu registrieren.&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Lock.png" style="float:left;margin-top:-7px;"&gt;&amp;nbsp; Closed Types&lt;/b&gt;&lt;br&gt;&lt;br&gt;Eine generische Klasse, die schon einen Typparameter hat. &lt;br&gt;IRepository&amp;lt;User&amp;gt; zu Repository&amp;lt;User&amp;gt; registrieren.&lt;br&gt;&lt;br&gt;Die Registrierung und Auflösung sieht in dem Fall so aus:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;builder.Register&amp;lt;IRepository&amp;lt;User&amp;gt;, Repository&amp;lt;User&amp;gt;();&lt;br /&gt;container.Resolve&amp;lt;IRepository&amp;lt;User&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Der &lt;u&gt;Nachteil&lt;/u&gt; 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.&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Open.png" style="float:left;margin-top:-7px;"&gt;&amp;nbsp; Open Types&lt;/b&gt;&lt;br&gt;&lt;br&gt;Eine generische Klasse, die keinen bestimmten Parameter hat.&lt;br&gt;Der Kontrakt, in dem Fall IRepository&amp;lt;&amp;gt; hätte die Implementation Repository&amp;lt;&amp;gt;.&lt;br&gt;&lt;br&gt;Der Vorteil dabei ist die Auflösung (on-the-fly) auf einem beliebigen Typparameter.&lt;br&gt;So wäre IRepository&amp;lt;User&amp;gt; und IRepository&amp;lt;UserGroup&amp;gt;.&lt;br&gt;&lt;br&gt;In dem Fall muss das Repository nur &lt;u&gt;ein einziges Mal&lt;/u&gt; registrieren werden und kann mit beliebigem Typ auflöst werden.&lt;br&gt;&lt;br&gt;Wenn das Projekt ein generisches Repository mit viele verschiedene Typen dazu hat, ist der open type die erste Wahl.&lt;br&gt;&lt;br&gt;Als Beispiel wird wieder eine Solution mit einer klassischen drei Schichten Architektur verwendet.&lt;br&gt;&lt;br&gt;Um das Ganze noch etwas zu vertiefen wird eine vierte Schicht „Core“ hinzugefügt. Diese beinhaltet die zentralen Interfaces wie bspw. IRepository oder IService.&lt;br&gt;&lt;br&gt;&lt;img alt="LightCore Generics Registration Project Tree" src="http://11249.2.sihosting.net/Blog/Images/LightCoreDemoGenerics.jpg"&gt;&lt;br&gt;&lt;br&gt;Das Repository muss wie oben beschrieben nur einmal registriert werden:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;container.Register(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;typeof&lt;/span&gt;(IRepository&amp;lt;&amp;gt;), &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;typeof&lt;/span&gt;(Repository&amp;lt;&amp;gt;));&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Jetzt könnten alle gewünschten Typen (Im Beispiel user und usergroup) instanziiert werden:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;container.resolve&amp;lt;IRepository&amp;lt;User&amp;gt;&amp;gt;();&lt;br /&gt;container.resolve&amp;lt;IRepository&amp;lt;UserGroup&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Anbei wie immer das Beispiel nicht vergessen! :-)&lt;br&gt;&lt;br&gt;
&lt;div class="DownloadBox"&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216101/download.aspx" title="Download LightCore Demo: Einführung"&gt;LightCore Demo: Einführung&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216102/download.aspx" title="Download LightCore Demo: Registrierung über Xml Modul"&gt;LightCore Demo: Registerirung über Xml Module&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216103/download.aspx" title="Download LightCore Demo: Registrierung von Generics"&gt;LightCore Demo: Registrierung von Generics&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=216097" width="1" height="1"&gt;</description><enclosure url="http://www.aspnetzone.de/blogs/robertobez/attachment/216097.ashx" length="63987" type="application/zip" /><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Asp.Net/default.aspx">Asp.Net</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/LightCore/default.aspx">LightCore</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/IoC/default.aspx">IoC</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Generics/default.aspx">Generics</category></item><item><title>DI / IoC Container LightCore Teil 2: Registrierung über Xml Modul</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-xml-module.aspx</link><pubDate>Sun, 21 Feb 2010 16:02:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:216096</guid><dc:creator>Roberto</dc:creator><slash:comments>5</slash:comments><comments>http://www.aspnetzone.de/blogs/robertobez/comments/216096.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/robertobez/commentrss.aspx?PostID=216096</wfw:commentRss><description>&lt;img alt="LightCore Xml Registration module" src="http://11249.2.sihosting.net/Blog/Images/LightCoreXml.gif" style="margin-right:5px;margin-bottom:5px;margin-top:5px;float:left;"&gt;Wie bereits im &lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx"&gt;ersten Teil&lt;/a&gt; erwähnt, wird es einer mehr Schichten Architektur immer wichtiger, Abhängigkeiten zu minimieren. Dabei einen ersten Schritt zu setzen, ist die Implementierung eines IoC Containers. Dieser hilft dabei, den Code in den diversen Projekten unabhängiger zu halten.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx" title="LightCore - Einführung"&gt;1. LightCore – Einführung&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-xml-module.aspx" title="LightCore - Registrierung über Xml Module"&gt;2. LightCore – Registrierung über Xml Module&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-generics.aspx" title="LightCore - Registrierung von Generics"&gt;3. LightCore – Registrierung von Generics&lt;/a&gt;&lt;br&gt;&lt;br&gt;Mich persönlich hat &lt;a href="http://www.aspnetzone.de/blogs/peterbucher/" title="Peter Bucher" target="_blank"&gt;Peter Bucher&lt;/a&gt; mit seinem neusten Projekt &lt;a target="_blank" href="http://lightcore.peterbucher.ch/"&gt;LightCore&lt;/a&gt; darauf aufmerksam gemacht. Anfangs war dies nur als Unit Testing Spielwiese gedacht, hat sich aber zu einem konkurrenzfähigen Micro Kernel entwickelt. Dessen weitere Entwicklung wird in Zukunft per Community gesteuert. Der Source Code wurde veröffentlicht und ist auf jeden Fall einen Blick Wert! (Stichwort: Codequalität)&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Zurück zum Thema. Viele werden sich denken, was bringt mir das Ganze eigentlich?&lt;br&gt;&lt;ul&gt;&lt;li&gt;Abhängigkeiten verringern und Kontrolle der Abhängigkeiten (Interface / Basisklasse - also Abstraktion) und dadurch auf die Instanziierung (Die sonst auf den konkreten Typen geht), rausziehen.&lt;/li&gt;&lt;li&gt;Dadurch bessere Testbarkeit und Aufbrechung der Anwendung in mehr Einzelteile, wodurch die Komplexität sinkt.&lt;/li&gt;&lt;li&gt;Außerdem globale Konfigurierbarkeit, was genutzt werden soll um Änderungen an vielen, unnötigen Stellen vorzunehmen.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;Nun wird anhand eines Beispiels wird gezeigt, wie man Lightcore in einer drei Schichten Architektur einsetzen bzw. integrieren kann.&lt;br&gt;Gleichzeitig wird die Registrierung über das integrierte Xml Modul erklärt&lt;br&gt;&lt;br&gt;Was eine drei Schichten Architektur (Tier 3 layer) ist, erklärt &lt;a target="_blank" href="http://code-inside.de/blog/"&gt;Robert Mühsig&lt;/a&gt; in &lt;a target="_blank" href="http://code-inside.de/blog/2008/07/09/howto-3-tier-3-schichten-architektur/"&gt;seinem Post&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Das folgende Beispiel wird eine Solution mit mehreren Projekten beinhalten, die eine Anwendung mit mehreren Schichten darstellt.&lt;br&gt;&lt;br&gt;Die Klassische Struktur sieht wie folgt aus:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Data Access Layer&lt;/li&gt;&lt;li&gt;Business Layer&lt;/li&gt;&lt;li&gt;Presentation Layer&lt;/li&gt;&lt;/ul&gt;Folglich könnten die Projekte so benannt werden:&lt;br&gt;&lt;br&gt;&lt;b&gt;Data&lt;/b&gt;: beinhaltet eine &lt;u&gt;User&lt;/u&gt;&lt;b&gt; &lt;/b&gt;Klasse sowie das dazugehörige &lt;u&gt;Repository&lt;/u&gt;.&lt;br&gt;&lt;br&gt;&lt;b&gt;Service&lt;/b&gt;: beinhaltet einen &lt;u&gt;User Service&lt;/u&gt; mit dem
 Repository als Member, der per Constructor Injection injiziert wird.&lt;br&gt;&lt;br&gt;&lt;b&gt;Web&lt;/b&gt;:
 Die Präsentation&lt;br&gt;&lt;br&gt;&lt;img alt="LightCore Xml Registration Project Tree" src="http://11249.2.sihosting.net/Blog/Images/LightCoreDemoPartTwo.jpg"&gt;&lt;br&gt;&lt;br&gt;Im &lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx"&gt;ersten Teil des Posts&lt;/a&gt; wurde gezeigt, wie man Kontrakte einfach per code (global.asax) registrieren kann. Der erste Schritt wird sein, die Registrierung in die &lt;b&gt;Web/App.config&lt;/b&gt; bzw. einer eigenen Konfigurationsdatei auszulagern.&lt;br&gt;&lt;br&gt;Wer achte gibt sieht, dass beim &lt;a href="http://lightcore.peterbucher.ch/download.aspx"&gt;heruntergeladenen Paket&lt;/a&gt; unter Anderem eine XML Schema Datei (LightCore.xsd), sowie eine Beispiel Konfiguration (SampleConfiguration.xml) dabei ist.&lt;br&gt;Nun die Datei LightCore.xsd dem aktuellen Web Projekt hinzufügen.&lt;br&gt;&lt;br&gt;Es kann eine eigene Konfigurationsdatei erstellt werden, oder aber einfach den entsprechenden Block in die Web/App.config hinzufügen.&lt;br&gt;Wer sich für letzteres entscheidet, den Block, der innerhalb der SampleConfiguration.xml zu finden ist, einfach in den &amp;lt;configuration&amp;gt; Abschnitt packen.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;configuration&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    …&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;LightCoreConfiguration&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="clr-namespace:LightCore.Configuration;assembly=LightCore.Configuration"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Als erstes kommt die Einstellung über den genutzten Lebenszyklus, also ob Singleton, Transient oder HttpRequest.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;LightCoreConfiguration.TypeAliases&amp;gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;TypeAlias&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Alias&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="HttpRequest"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="LightCore.Integration.Web.HttpRequestLifecycle, LightCore.Integration.Web"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/LightCoreConfiguration.TypeAliases&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Jetzt die eigentliche &lt;b&gt;Registrierung&lt;/b&gt;.&lt;br&gt;Einfache Registrierungen ohne Gruppen kommen in die LightCoreConfiguration.Registrations Sektion:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;LightCoreConfiguration.Registrations&amp;gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Registration&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyRepository"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ContractType&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyAssembly.IUserRepository, MyAssembly"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ImplementationType&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyAssembly.Repository, MyAssembly"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/LightCoreConfiguration.Registrations&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Sollte selbsterklärend sein, Namensangabe um den registrierten Kontrakt wiederzufinden, der Kontrakttyp sowie die Klasse mit jeweiliger Angabe des Assembly Namens. Optionale Argumente für den Konstruktor können über Arguments=“Value1, Value2“ mitgegeben werden. Wenn die LightCore.xsd im Projekt eingebunden wurde, sollte auch IntelliSense zur Verfügung stehen!&lt;br&gt;&lt;br&gt;Ist eine gruppierte Registrierung gewollt, um bspw. die Repositories zu sammeln, gibt es auch hierfür eine Sektion:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;LightCoreConfiguration.RegistrationGroups&amp;gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;RegistrationGroup&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Repositories"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &amp;lt;RegistrationGroup.Registrations&amp;gt;&lt;br /&gt;            &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Registration&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyRepository"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ContractType&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyAssembly.IUserRepository, MyAssembly"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ImplementationType&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="MyAssembly.Repository, MyAssembly"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &amp;lt;/RegistrationGroup.Registrations&amp;gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;RegistrationGroup&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/LightCoreConfiguration.RegistrationGroups&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Jetzt wo die Registrierung der Repositories gemacht wurde, muss der Container erstellt und das &lt;b&gt;Konfigurationsmodul&lt;/b&gt; zugewiesen werden.&lt;br&gt;&lt;br&gt;Dies sollte in der Globalen Anwendungsdatei (global.asax) in der Application_Start methode gemacht werden:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Application_Start(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    var builder &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; ContainerBuilder();&lt;br /&gt;    var module &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; XamlRegistrationModule();&lt;br /&gt;    builder.RegisterModule(module);&lt;br /&gt;    _container &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; builder.Build();&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Wenn gewollt, kann die Konfigurationsdatei im Konstruktor des XamlRegistrationModules angegeben werden:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;var module &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; XamlRegistrationModule(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"~/MyConfiguration.xml"&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Die Objekte können wie gehabt mit resolve aufgelöst werden&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;var myRepository &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; _container.Resolve&amp;lt;IRepository&amp;gt;(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"MyRepository"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Fazit: Welche Variante ist nun besser?&lt;/b&gt;&lt;br&gt;&lt;br&gt;Registrierung per Code hat den Vorteil, dass weniger Fehler auftreten können.&lt;br&gt;Da es kompiliert werden muss, wird überprüft ob der Kontrakt implementiert ist oder nicht.&lt;br&gt;&lt;br&gt;Somit ist es intuitiver und Refactoring-sicher. Wenn eine Klasse umbenannt wird – wird sie auch hier übernommen.&lt;br&gt;&lt;br&gt;Allerdings hat die Registrierung per Code einen riesen Haken: Es ist eine harte – also feste – Referenz.&lt;br&gt;Wenn eine Assembly, aus welchem Grund auch immer, ausgetauscht wird, muss das komplette Projekt neu kompiliert werden.&lt;br&gt;&lt;br&gt;Sollte das bei einer Produktivumgebung der Fall sein, kann das ein großer Nachteil sein. Dadurch muss ein komplettes Deployment gemacht werden.&lt;br&gt;&lt;br&gt;Was also „besser“ ist, hängt vom Anwendungsfall ab.&lt;br&gt;Ich persönlich finde die „per Code“ Variante bei nicht allzu vielen Klassen übersichtlich.&lt;br&gt;Eine gut durchdachte Anwendungsstruktur von Anfang an ist natürlich Voraussetzung :-) &lt;br&gt;&lt;br&gt;Anbei gibt’s wie immer das oben gezeigte Beispiel als Download.&lt;br&gt;&lt;br&gt;
&lt;div class="DownloadBox"&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216101/download.aspx" title="Download LightCore Demo: Einführung"&gt;LightCore Demo: Einführung&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216102/download.aspx" title="Download LightCore Demo: Registrierung über Xml Modul"&gt;LightCore Demo: Registerirung über Xml Module&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216103/download.aspx" title="Download LightCore Demo: Registrierung von Generics"&gt;LightCore Demo: Registrierung von Generics&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=216096" width="1" height="1"&gt;</description><enclosure url="http://www.aspnetzone.de/blogs/robertobez/attachment/216096.ashx" length="82873" type="application/zip" /><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Asp.Net/default.aspx">Asp.Net</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/LightCore/default.aspx">LightCore</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/IoC/default.aspx">IoC</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Xml/default.aspx">Xml</category></item><item><title>DI / IoC Container LightCore Teil 1: Einführung</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx</link><pubDate>Sat, 16 Jan 2010 16:03:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:215449</guid><dc:creator>Roberto</dc:creator><slash:comments>4</slash:comments><comments>http://www.aspnetzone.de/blogs/robertobez/comments/215449.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/robertobez/commentrss.aspx?PostID=215449</wfw:commentRss><description>&lt;img src="http://11249.2.sihosting.net/Blog/Images/LightCore1.gif" style="margin-right:5px;margin-bottom:5px;margin-top:5px;float:left;" alt="LightCore DI/Ioc Container"&gt;In einer mehrschichtigen Architektur (Oft verwendet die&lt;a title="How to tier 3 Schichten Architektur" target="_blank" href="http://code-inside.de/blog/2008/07/09/howto-3-tier-3-schichten-architektur/"&gt; 3-Tier/3 Schichten Architektur&lt;/a&gt;) wird es immer wichtiger Abhängigkeiten zu minimieren. &lt;br&gt;In großen Projekten kann es leicht vorkommen, dass ein Chaos von Abhängigkeiten entsteht. &lt;br&gt;Nicht alle Abhängigkeiten lassen sich vermeiden, aber viele sind unnötig. Vor allem falsche können die Entwicklung eines Projektes aufhalten.&lt;br&gt;&lt;br&gt;In den diversen Schichten(Data, Web, …)&amp;nbsp; den Code unabhängig voneinander zu halten, hilft dem gesamten Prozess ungemein. &lt;br&gt;Eine Technik, um die Kopplung so gering wie möglich zu halten ist ein Inversion of Control Container. (IoC Container) &lt;br&gt;&lt;br&gt;Mehr dazu in einem Artikel von Martin Fowler: &lt;a title="Inversion of control" target="_blank" href="http://martinfowler.com/articles/injection.html"&gt;Inversion of Control Containers and the Dependency Injection pattern&lt;/a&gt;&lt;br&gt;&lt;br&gt;Genauer eingegangen wird auf den frischen IoC Container „&lt;a title="LightCore" target="_blank" href="http://lightcore.peterbucher.ch/"&gt;LightCore&lt;/a&gt;“ von &lt;a target="_blank" href="http://www.peterbucher.ch"&gt;Peter Bucher&lt;/a&gt;. &lt;br&gt;Wie das Wort schon sagt, ist dieser lightweight und kann mit Performance und Einfachheit punkten, muss aber nicht in Sachen Features einpacken. &lt;br&gt;&lt;br&gt;Eine Feature List von Lightcore finder sich &lt;a target="_blank" href="http://lightcore.peterbucher.ch/features.aspx"&gt;hier&lt;/a&gt;.&lt;br&gt;Weiter Argumente die für LightCore sprechen finden sich in einem &lt;a target="_blank" title="LightCore im Vergleich" href="http://www.des-eisbaeren-blog.de/post/2010/01/01/LightCore.aspx"&gt;Blogeintrag&lt;/a&gt; von &lt;a title="Golo Roden" target="_blank" href="http://www.des-eisbaeren-blog.de/"&gt;Golo Roden&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/01/16/inversion-of-control-di-ioc-container-lightcore.aspx" title="LightCore - Einführung"&gt;1. LightCore – Einführung&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-xml-module.aspx" title="LightCore - Registrierung über Xml Module"&gt;2. LightCore – Registrierung über Xml Module&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2010/02/21/ioc-container-lightcore-registration-generics.aspx" title="LightCore - Registrierung von Generics"&gt;3. LightCore – Registrierung von Generics&lt;/a&gt;&lt;br&gt;&lt;br&gt;Der Erste Teil der Einführung wird ein einfaches Beispiel mit LightCore behandeln. &lt;br&gt;Um etwas tiefer in die Materie einzusteigen wird im zweiten Teil gezeigt, wie man mit LightCore die Unabhängigkeit einer 3-Schichten Architektur verbessern kann, wie man mit dem integrierten Registrations-Modul über Xml bzw. XAML arbeitet und wie man Generics registrieren kann.&lt;br&gt;&lt;br&gt;&lt;b&gt;Einbinden von Lightcore&lt;/b&gt;&lt;br&gt;&lt;br&gt;Wer auf die Entwicklungsversion zugreifen will, muss sich diese mit &lt;a title="Subversion SVN" href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; laden.&lt;br&gt;Diese wurde vor allem laut den Prinzipien von CCD (&lt;a title="Clean code developers" target="_blank" href="http://www.clean-code-developer.de/"&gt;Clean code development&lt;/a&gt;) und mit einer kompletten Unit Test Abdeckung entwickelt – somit auf jeden Fall einen Blick Wert!&lt;br&gt;&lt;br&gt;Für das folgende Beispiel reichen die DLLs, die es ebenfalls &lt;a title="Download lightcore" target="_blank" href="http://lightcore.peterbucher.ch/download.aspx"&gt;hier zum Download&lt;/a&gt; gibt.&lt;br&gt;&lt;br&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/LightCore2.jpg"&gt;&lt;br&gt;&lt;br&gt;Als Erstes müssen die gewünschten Kontrakte (Schnittstellen) registriert werden. Dies kann über zwei Varianten erfolgen:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Registrierung über Code&lt;/li&gt;&lt;li&gt;Registrierung über eine XML Konfigurations- Datei&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;Wenn die Registrierung codeseitig gewünscht ist, sollte dies in der Globalen Anwendungsdatei (Global.asax) erfolgen&lt;br&gt;&lt;br&gt;Der Container wird als static member deklariert&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; IContainer _container;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;In der Methode Application_Start wird der IoC Container initialisiert.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Application_Start(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    var builder &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; ContainerBuilder();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Es gibt mehrere, optionale Features, die bei der Registrierung angegeben werden können. Für das Beispiel wird ein Logger registriert.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Einfache Registrierung&lt;/span&gt;&lt;br /&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;();&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Angabe eines Namen, um eine klare Trennung zu behalten&lt;/span&gt;&lt;br /&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;().WithName(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"MyLogger"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Angabe einer Gruppe, um bestimmte Kontrakte zu sammeln&lt;/span&gt;&lt;br /&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;().WithGroup(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"MyGroup"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Angabe von Argumenten für den Konstruktoraufruf&lt;/span&gt;&lt;br /&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;().WithArguments(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Test Argument"&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Gemischte Angabe&lt;/span&gt;&lt;br /&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;().WithName(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"MyLogger"&lt;/span&gt;).WithArguments(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Test Argument"&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Wenn alles registriert ist, den Container noch erstellen:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;_container &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; builder.Build();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Die Registrierten Kontrakte können manuell über resolve aufgelöst werden&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Einfach&lt;/span&gt;&lt;br /&gt;var myLogger &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; _container.Resolve&amp;lt;ILogger&amp;gt;();&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;//Mit Namen&lt;/span&gt;&lt;br /&gt;var myLogger &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; _container.Resolve&amp;lt;ILogger&amp;gt;(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"MyLogger"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Lifecycle&lt;/b&gt;&lt;br&gt;&lt;br&gt;Der Lebenszyklus besagt, ob bei jedem Anfordern einer Instanz über &amp;lt;Container&amp;gt;.Resolve&amp;lt;Icontract&amp;gt;() ein neues Objekt erstellt wird (Identisch zum new-Operator), oder das Objekt wiederverwendet werden kann.&lt;br&gt;&lt;br&gt;Für die Wiederverwendung von Instanzen werden Folgende Lebenszyklen unterstützt, wobei auch weitere Lebeszyklen geschrieben werden können:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Transient&lt;/li&gt;&lt;li&gt;Singleton&lt;/li&gt;&lt;li&gt;ThreadSingleton&lt;/li&gt;&lt;li&gt;HttpRequest&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;Als Standard wird der transient Lebenszyklus verwendet. Dies besagt, dass bei jedem Aufruf eine neue Instanz der Klasse erstellt wird. Singleton würde bedeuten, dass eine einzige Instanz pro Anwendung erzeugt wird.&lt;br&gt;&lt;br&gt;Der Lebenszyklus wird einmal pro Kernel wie folgt gesetzt:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;builder.DefaultControlledBy&amp;lt;TransientLifecycle&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Klarer weiße kann man den Lebenszyklus auch pro Registration angeben:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;builder.Register&amp;lt;ILogger, Logger&amp;gt;().ControlledBy&amp;lt;SingletonLifecycle&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Die Lebenszyklen können ohne Probleme beliebig erweitert werden.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Das Ergebnis&lt;/b&gt;&lt;br&gt;&lt;br&gt;Angenommen wir haben den Logger registriert und möchten nun die Instanz in einer normalen Page Klasse&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; partial &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; _Default : System.Web.UI.Page&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; ILogger Logger&lt;br /&gt;    { &lt;br /&gt;        get; &lt;br /&gt;        set;&lt;br /&gt;    }&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;In der Page Load wird der logger nun benötigt:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    ILogger logger &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.Logger;&lt;br /&gt;    logger.log(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Page Loaded!"&lt;/span&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Und wie von Magie haben wir eine Instanz der Klasse ohne direkte Erstellung auf der aktuellen Seite.&lt;br&gt;&lt;br&gt;Was ist passiert?&lt;br&gt;Ein http Modul in Lightcore macht automatisch ein resolve auf die Eigenschaften, die registriert sind. Somit entfällt die manuelle Auflösung und man ist komplett vom Dependency Injection Container unabhängig.&lt;br&gt;&lt;br&gt;Damit das auch klappt, muss das Modul in der Web config im Abschnitt &amp;lt;httpModules&amp;gt; hinzugefügt werden:&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpModules&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    ...&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;add&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="LightCoreDependencyInjectionModule"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="LightCore.Integration.Web.DependencyInjectionModule, LightCore.Integration.Web, Version=1.0.0.0, Culture=neutral"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;httpModules&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Mit ein bisschen Kreativität kann diese Vorgehensweise in allen möglichen Stellen eingesetzt werden – und schon ist man ein klein wenig Unabhängiger!&lt;br&gt;&lt;br&gt;Der zweite Teil des Posts wird mit folgenden Themen in Kürze folgen: Registration über Web/App Config oder eigene Konfigurationsdatei, Einsatz in einer 3 Schichten Architektur und Registrierung von Generics!&lt;br&gt;&lt;br&gt;Anbei gibt’s wie immer das oben angeführte Beispiel!&lt;br&gt;&lt;br&gt;
&lt;div class="DownloadBox"&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216101/download.aspx" title="Download LightCore Demo: Einführung"&gt;LightCore Demo: Einführung&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216102/download.aspx" title="Download LightCore Demo: Registrierung über Xml Modul"&gt;LightCore Demo: Registerirung über Xml Module&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.aspnetzone.de/files/folders/216103/download.aspx" title="Download LightCore Demo: Registrierung von Generics"&gt;LightCore Demo: Registrierung von Generics&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=215449" width="1" height="1"&gt;</description><enclosure url="http://www.aspnetzone.de/blogs/robertobez/attachment/215449.ashx" length="48217" type="application/zip" /><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Asp.Net/default.aspx">Asp.Net</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/LightCore/default.aspx">LightCore</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/IoC/default.aspx">IoC</category></item></channel></rss>