Lutz-IT GmbH - Ihr Partner für IT-Consulting und Programmierung
  • Email
  • Rss
Tel: +41 76 459 0580
  • IT-Consulting
  • Programmierung
  • Showcases
  • Blog
  • Referenzen
  • Auszeichnungen
  • Kontakt
Search the site...
Home» Programmierung » View und ViewModel mit MEF unter testbarkeits Aspekten verbinden

View und ViewModel mit MEF unter testbarkeits Aspekten verbinden

Posted by Benjamin Lutz - 11. Juni 2011 - Programmierung
0

In letzter Zeit habe ich mich damit beschäftigt wie man effizient Views und Viewmodels in Silverlight verbinden könnte, da ich immer wieder mit komplizierten bis extrem komplizierten Mechanismen in Projekten konfrontiert wurde. Mein erster Ansatz war das Zuweisen des DataContexts in der View, wie es in vielen Blogs und Beispielen beschrieben ist.

    <UserControl.DataContext>
        <MEFedMVVM:MainPageViewModel/>
    </UserControl.DataContext>

Das ist allerdings statisch und nicht elegant und unter Unittest Aspekten eine Katastrophe. Meine nächste Idee war, es mit MEF und mit dem ServiceLocator aus Microsoft Patterns & Practises das ViewModel über den Typ zu discovern. Der ServiceLocator kann unter http://commonservicelocator.codeplex.com/ downgeloadet werden. Im nächsten Schritt muss ein Service Provider für MEF geschrieben werden, welcher die MEF Exports auflistet und den richtigen Typen auflöst.

    public class MefServiceLocator : ServiceLocatorImplBase
    {
        private readonly ExportProvider _provider;

        public MefServiceLocator(ExportProvider provider)
        {
            _provider = provider;
        }

        protected override object DoGetInstance(Type serviceType, string key)
        {
            if (key == null)
            {
                key = AttributedModelServices.GetContractName(serviceType);
            }
            var exports = _provider.GetExports<object>(key);
            if (exports.Any())
            {
                return exports.First().Value;
            }
            throw new ActivationException(string.Format("The Type {0} could not be resolved!", key));
        }

        protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
        {
            return new List<object> { Activator.CreateInstance(serviceType) };
        }
    }

Mit dieser Klasse ist es nun möglich über diesen Aufruf ein ViewModel (oder einen beliebigen anderen Typen) zu discovern

    ServiceLocator.Current.GetService(Type.GetType("MyNamespace.MyViewModel"));

So ist das schon deutlich eleganter und testbar, denn dem ServiceLocator kann man für Unittests bzw. für Coded UI Tests einen anderen ServiceLocator zuweisen und schon kann ein anderes ViewModel zurückgegeben werden, welches gar nicht dem angeforderten Typ entspricht. Um das ViewModel der View zuzuweisen fehlt allerdings noch ein Schritt, denn den oben genannten Aufruf bekommt man so nicht ins XAML und Code Behind ist an dieser Stelle auch nicht wirklich elegant. Um dieses Problem zu lösen habe ich mich wieder der Behaviour bedient.

    public class ViewModelLocatingBehavior : Behavior
    {
        public string ViewModelName { get; set; }

        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.DataContext =  ServiceLocator.Current.GetService(Type.GetType(ViewModelName));
        }

    }

Diese Behaviour kann ins XAML eingefügt werden und ist unserem Ausgangscode sehr ähnlich.

    <i:Interaction.Behaviors>
        <MEFedMVVM:ViewModelLocatingBehavior ViewModelName="MEFedMVVM.MainPageViewModel"/>
    </i:Interaction.Behaviors>

Die Initialisierung des ServiceLocators erfolgt im Startup Code der App.xaml.cs

Schematische Darstellung der MEF/ServiceLocator Architektur

Schematische Darstellung der MEF/ServiceLocator Architektur

Somit ist das Ziel erreicht und das ViewModel wird automatisch via MEF Export und ServiceLocator zugewiesen. Noch ein kleiner Tipp zum Schluss, den ersten Ansatz habe ich auskommentiert im XAML gelassen, da der Designer mit dem ServiceLocator und MEF Ansatz nichts anzeigt. Braucht man im Desiner Daten (z.B. Gridspalten) dann wird das Code-Fragment einkommentiert. Die beiden Ansätze beissen sich im Designer nicht.

Um das Beispiel in Gänze nachzuvollziehen, können Sie sich das Visual Studio Projekt hier downloaden.

MEF, MVVM, ServiceLocator, Silverlight, Unittest, Windows Presentation Foundation
0 comments
  Livefyre
  • Get Livefyre
  • FAQ
Sign in
+ Follow
Post comment
 
Link
Newest | Oldest

Neueste Artikel

  • Windows Service Installation Simplified

    17. Juni 2013
  • Generieren eines Software Architektur Dokuments mit Enterprise Architect

    21. Mai 2013
  • .NET 4.5 Trading API für Interactive Brokers

    6. Mai 2013
  • Windows 8.1 jetzt doch wieder mit Start Menü?

    29. April 2013
  • WCF Service Discovery mit .NET 4

    12. April 2013

    Artikel Archiv

    • [+] 2013 (15)
      • [+] Juni (1)
        • Windows Service Installation Simplified
      • [+] Mai (2)
        • Generieren eines Software Architektur Dokuments mit Enterprise Architect
        • .NET 4.5 Trading API für Interactive Brokers
      • [+] April (3)
        • Windows 8.1 jetzt doch wieder mit Start Menü?
        • WCF Service Discovery mit .NET 4
        • Hackerangriff auf Blog durch SQL-Injection
      • [+] März (3)
        • Distributed Event Aggregator bzw. ServiceBus simplified
        • Aspekt orientierte Programmierung (AOP)
        • Testautomatisierung mit Unittests und Moq
      • [+] Februar (2)
        • Unleash the power of Domain-Specific Language in VS2012
        • Benutzeroberflächen ergonomisch gestalten
      • [+] Januar (4)
        • Trend Trading System App für Windows 8 verfügbar
        • Erfahrungsbericht: Domain Oriented N-Layered von Microsoft Spain
        • Kommunikationsszenarien mit NServiceBus 3.3
        • HTML5 Anwendung als WinRT Application veröffentlichen
    • [+] 2012 (28)
      • [+] Dezember (1)
        • DataBinding und das MVVM-Pattern in HTML5
      • [+] November (2)
        • Der Unterschied zwischen Sieger- und Verlierertypen
        • Tücken bei der Personalbeschaffung von .NET Entwicklern
      • [+] Oktober (2)
        • Kostenloser Kursdaten REST-Service
        • Migration von .NET 4 Projekten nach WinRT (JS)
      • [+] September (2)
        • Migration von .NET 4 Projekten nach WinRT (XAML)
        • Windows 8 im Praxistest
      • [+] August (1)
        • Eigene Sections in der .NET Standard Konfiguration
      • [+] Juli (2)
        • Steigerung des Marktwerts durch Weiterbildung
        • Effiziente Kostenstrukturen im IT-Consulting - Teil 4
      • [+] Juni (1)
        • Effiziente Kostenstrukturen im IT-Consulting - Teil 3
      • [+] Mai (3)
        • Effiziente Kostenstrukturen im IT-Consulting - Teil 2
        • Effiziente Kostenstrukturen im IT-Consulting - Teil 1
        • Vision eines Entwicklerarbeitsplatzes in der Zukunft
      • [+] April (3)
        • Windows 8 und die Zukunft von Silverlight und WinRT
        • Elegante und Effiziente Data Access Layer mit Dapper.NET
        • Quartalsergebnis Q1/2012 des Trendfolge-Handelssystems
      • [+] März (3)
        • Konfiguration von WCF Services in Silverlight
        • Rapid GUI Prototyping mit Mockups
        • Chancen und Risiken des Entity Frameworks
      • [+] Februar (3)
        • Vorsicht vor Recruiter aus Grossbritannien
        • Financial Chart für Silverlight und WPF
        • Erste Handelssignale 2012
      • [+] Januar (5)
        • Microsoft Silverlight 5 endlich verfügbar
        • Riskmanagement in IT-Projekten
        • Artikelempfehlung: "Schluss mit dem Burnout-Gejammer!"
        • Ursachen von hoher Fluktuation in IT-Projekten
        • Einsatzgebiete von Silverlight5 und HTML5
    • [+] 2011 (36)
      • [+] Dezember (4)
        • Business Objekt Modelle in Entwicklungsprojekten
        • Einsatz von Open Source in Entwicklungsprojekten
        • Buchempfehlung: "Ich weiss, wie du tickst" ISBN 3280054109
        • Prozessverbesserungen für qualitativ hochwertigen Code
      • [+] November (2)
        • Deklarative .NET Programmierung mit Attributen
        • Favorisierte Lösung für Silverlight Reporting
      • [+] Oktober (3)
        • Silverlight Reportinglösungen
        • Testautomatisierung mit Silverlight
        • .NET Schlüsseltechnologien der nächsten Jahre
      • [+] September (4)
        • Hauptgründe für das Scheitern von IT-Projekten
        • Auswahl der Titel für das Handelssystem
        • WebClient Sicherheitsrichtlinien in Silverlight
        • Nachhaltiger Erfolg im Consulting Teil 7 - Projektdauer
      • [+] August (4)
        • Nachhaltiger Erfolg im Consulting Teil 6 - Vertragsverhandlungen
        • Nachhaltiger Erfolg im Consulting Teil 5 - Vorstellungsgespräch
        • Nachhaltiger Erfolg im Consulting Teil 4 - Stundensatzverhandlungen
        • Nachhaltiger Erfolg im Consulting Teil 3 - Bewerbungsmanagement
      • [+] Juli (4)
        • Nachhaltiger Erfolg im Consulting Teil 2 – Onlineportale
        • Nachhaltiger Erfolg im Consulting Teil 1 - Das Profil
        • Integration von Windows Forms Controls in WPF
        • Unittesten von WCF-Services mit der ServiceHost Klasse
      • [+] Juni (4)
        • Verteilte Transaktionen in einer Service orientierten Architektur
        • Service orientierte Architektur und Domain Driven Design
        • View und ViewModel mit MEF unter testbarkeits Aspekten verbinden
        • Entfernung ungenutzter Strings in .NET Resource-Files
      • [+] Mai (5)
        • Enterprise Library Silverlight Integration Pack Validation Block Teil II
        • Enterprise Library Silverlight Integration Pack Validation Block Teil I
        • Programmierung von Streaming Services mit WCF und Silverlight
        • Order Statemachine mit Workflow Foundation 4
        • Memory leaks bei eventbasierten Architekturen
      • [+] April (5)
        • Linq Expressions in der Praxis
        • Handelsregeln mit der .NET Rule Engine umsetzen Teil II
        • Handelsregeln mit der .NET Rule Engine umsetzen Teil I
        • Plugin Mechanismus für Trading Systeme
        • Charttechnik mit .NET
      • [+] März (1)
        • Schaffen der Grundlagen für ein eigenes Handelssystem
    © 2013 Lutz-IT GmbH