2016-12-29 4 views
3

Ich habe Mark Seemann Buch Dependency Injection in .NET gelesen. Und ich denke, ich verstehe das meiste von dem, was er geschrieben hat.Wie kann ich Dependency Injection mit MvvM anwenden?

Das Problem, mit dem ich Probleme habe, ist, dass ich Viewmodels in Ansichten injizieren will. Ich weiß, dies kann durch

public class CompositeRoot 
{ 
    private IContainer container; 
    public CompositeRoot() 
    { 
     //build the container 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<DatabaseContext>().As<IDatabaseContext>(); 
     builder.RegisterType<MainViewModel>().As<IMainViewModel>(); 
     container = builder.Build(); 

     //create a window and inject a viewmodel 
     MainWindow mainWindow = container.Resolve<MainWindow>(); 
     mainWindow.DataContext = container.Resolve<IMainViewModel>(); 
     mainWindow.Show(); 
    } 
} 

getan werden, aber dies scheint ziemlich grob.

Ich dachte an:

public class CompositeRoot 
{ 
    private IContainer container; 
    public CompositeRoot() 
    { 
     //build the container 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<DatabaseContext>().As<IDatabaseContext>(); 
     builder.RegisterType<MainViewModel>().As<IMainViewModel>(); 
     container = builder.Build(); 

    } 

    public IMainViewModel MainVM 
    { 
     get { return container.resolve<IMainViewModel>(); } 
    } 
} 

Und dann in der XAML-Code setzen

DataContext="{Binding MainVM, Source={StaticResource IoC}}" 

(im app.xaml hätte ich compositeroot eine Ressource als IoC genannt werden)

Meine Frage ist jetzt, wäre das gut Dependency Injection, oder wäre dies immer noch das Service-Locator-Muster (das ist ein Anti-Muster, so will ich es nicht verwenden)

Wenn dies das Anti-Muster ist, was sind meine Optionen?

+0

Related: https://stackoverflow.com/questions/32307033/how-to-use-wpf-controls-with-simple-injector-dependencies – Steven

Antwort

1

Ihre Lösung sieht perfekt für mich aus. In der Tat ist dies der gleiche Ansatz, der in der MVVM light library (CompositionRoot heißt stattdessen ViewModelLocator) verwendet wird. Der wichtige Punkt ist, dass der Locator nur zum Binden von Ansichten zum Anzeigen von Modellen verwendet wird und nicht in Ansichtsmodelle injiziert werden soll (dies wäre der service locator pattern, den Sie zu vermeiden versuchen).