Posts mit dem Label SCSF werden angezeigt. Alle Posts anzeigen
Posts mit dem Label SCSF werden angezeigt. Alle Posts anzeigen

Montag, April 11, 2011

Ein paar Unity 2.0 Beispiele

Ich komme kaum noch zum Bloggen, es findet sich immer etwas Wichtigeres. Zu dem fehlt momentan die Kick-Technologie zum bloggen.

Heute stelle ich zumindest mal meine Samples zu Unity 2.0 zum Download. Ich setze in fast all meinen Projekten Unity ein (außer ich muss etwas anderes nutzen), da es sehr simpel und effektiv ist. Unity ist bei Microsoft in eine wichtige Rolle geschlüpft. Heute habe ich gelernt, dass Unity im Exchange Server 2010 verwendet wird. Ich muss mir das zukünftig mal genauer anschauen. Das

Unity kann man Inline konfigurieren, oder per externer Konfiguration initiieren. Bei der Konfiguration per Code werden die Typen und Mappings direkt zum Container hinzugefügt. Die Inline Konfiguration nutze ich als Fallback, falls keine Konfiguration im Container vorhanden ist.

   1:  IUnityContainer container = new UnityContainer();
   2:  container.RegisterType<ITestInterface, TEstRunner>();
   3:  container.RegisterType<ITestInterface, TEstRunner>("specialVersion");
   4:  container.RegisterType<ITestInterface, TEstRunner>("singelton", new ContainerControlledLifetimeManager());
Prüfung, ob eine Definition vorhanden ist.
if(!container.IsRegistered<ITestInterface>())container.RegisterType<ITestInterface, TEstRunner>();

Zur Konfiguration mittels der Konfigurationsdatei muss der Container mit

new UnityContainer().LoadConfiguration();

initialisiert werden. Die Konfiguration könnte zum Beispiel so aussehen:

   1:  <configuration>
   2:    <configSections>
   3:      <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
   4:    </configSections>
   5:   
   6:    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
   7:      <alias alias="runner" type="PoC.Unity.Configuration.TEstRunner, PoC.Unity.Configuration"/>
   8:      <alias alias="Iservice" type="PoC.Unity.Configuration.ITestInterface, PoC.Unity.Configuration"/>
   9:      <container>
  10:        <register type="Iservice"  mapTo="runner"/>
  11:        <register type="Iservice"  mapTo="runner" name="specialVersion">
  12:          <lifetime type="perthread"/>
  13:        </register>
  14:        <register type="Iservice"  mapTo="runner" name="singelton">
  15:          <lifetime type="singleton"/>
  16:        </register>
  17:      </container>
  18:    </unity>
  19:  </configuration>

Beim Erstellen eines Objektes durch den Container, können notwendige Abhängigkeiten ohne weitere Aktionen übergeben werden, sofern diese dem Container bekannt sind. (Injection) Ich nutze meistens Konstruktur Injection, da dies aus meiner Sicht die richtige Anwendung für erforderliche Komponenten ist.

   1:  public class TEstRunner : ITestInterface
   2:  {
   3:      private readonly IUnityContainer _container;
   4:      public TEstRunner(IUnityContainer container)
   5:      {
   6:          _container = container;
   7:          Console.WriteLine("Do I have a container? - " + (ReferenceEquals(_container, null) ? "no" : "yes"));
   8:      }
   9:  ...
  10:  }
  11:  container.Resolve<ITestInterface>().Run();

AOP ist etwas komplizierter, sobald es einmal läuft, auch wieder ganz einfach. ;) Allerdings muss man einige Utility-Klassen erstellen, so ist eine Attribute-Klasse und eine Implementierung des ICallHandler-Interface notwendig. Hier zumindest mal die Unity-Konfiguration:

   1:  IUnityContainer uc = new UnityContainer();
   2:  uc.AddNewExtension<Interception>();
   3:  uc.RegisterType<ITestInterface, TEstRunner>();
   4:  uc.Configure<Interception>()
   5:      .SetDefaultInterceptorFor<ITestInterface>(new InterfaceInterceptor());

Eigentlich ist es egal welchen DI/IoC Container man nutzt, es hilft den Code testbarer zu machen und reduziert Abhängigkeiten deutlich. Das Beste Bespiel für die Reduzierung von Abhängigkeiten erlebt man, wenn man mit Prism arbeitet.

Hier noch der Link zu einem schönen Video zu Unity (etwas veraltet): Unity Features and Futures at the patterns and practices Summit 2009

Samples: poc.unity.zip

Montag, Dezember 03, 2007

Smart Client Software Factory Erfahrungen

Nun endlich mal was zu dem Thema SCSF.

Wer die SCSF installieren möchte, der sollte dafür am besten eine VM nutzen. Man benötigt einiges an Beta-Software für den Client. Unbedingt auch die Versionen beachten. Es könnte sonst passieren, dass nicht viel geht. Aktuell ist das Mai 2007 CTP Release, dazu benötigt man:

·         Guidance Automation Extensions

·         Guidance Automation Toolkit

·         Optional VS2005 Extensions für .NET 3.0

Gute Arbeit leistet aber der Dependency Checker, der bei der SCSF mitgeliefert wird. Alle notwendigen Downloads werden vom Checker geprüft und die Links zur Verfügung gestellt.

Wer eine Installation unter Visual Studio 2008 wagen möchte, der sollte mal im Blog von Ezequiel Jadib vorbeischauen. Der Post ist allerdings für Orca Beta 2, wer etwas Ahnung hat, der sollte sonst aber auch keine Probleme haben. Ich habe das nicht ausprobiert, da ich wie oben geschrieben hab, die Installation in einer VM durchgeführt habe.

Die Hands on Labs (HOL) sind leider auch noch in einer Beta Phase und noch nicht komplett, aber um einen Einstieg zu erhalten, sind sie super.

Als Anwendung bieten sich eigentlich alle Anwendungen an, die im Intranet eines Unternehmens ausgeführt werden. Durch die saubere, manchmal auch etwas aufwendigere, Aufteilung und Entkopplung können Module leicht auf Veränderungen reagieren. Die Entkopplung ist bereits in vielen anderen Factories enthalten und ist definitiv für eine verbesserte Wartbarkeit durchzuführen.

Dies ist jetzt mein 3. Oder 4. Anlauf, wenn ich die CAB-Versuche mit zähle, mich in die Materie und Verwendung einzuarbeiten. Man sollte sich dafür durchaus 20h Zeit nehmen und einfach die HOLs von vorn bis hinten durchgehen. Bevor danach die Arbeit losgeht, sollte man sich aber noch mal Gedanken, wie bei jedem Projekt, über die Module machen. Ebenso ist es wichtig die Aufteilung/Layout des SCSF-Workspace zu beachten.

Ich werde mich das nächste Jahr weiter mit verschiedenen Modulen beschäftigen, unter anderem ein Modul zum Bearbeiten einer SVN-Authz-Datei und zur besseren Pflege von Stammdaten in unserem Unternehmen. Die für mich interessanteren Stammdatenpflege-Module sind unsere Mitarbeiterkontakte und die Projektdaten. Wer jetzt schreit Kundendaten kann er auch noch machen, wenn er schon Mitarbeiterdaten entwickelt, der irrt aus meiner Sicht. Kundendaten sind wesentlich Komplexer und werden vermutlich in anderen/mehreren Datenquellen abgelegt. Mitarbeiter Informationen sollten alle aus dem Active Directory kommen. Natürlich muss man dafür das AD-Schema evtl. erweitern. Mal schauen, wie schwierig es wird alle Daten in das AD zu überführen. Allerdings bedarf es vor dem Beginn der Mitarbeiterpflege einiger Nachforschungen der Informationen der Mitarbeiter.

Ich werde den Service zum ändern der SVN-Authz-Datei, sobald er fertig ist hier zur Verfügung stellen. Momentan ist das Laden implementiert, dies ist allerdings noch nicht bis ins kleinste getestet, was auch noch eine Weile dauern wird. Momentan will ich es einfach zum Laufen bringen.