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?
Related: https://stackoverflow.com/questions/32307033/how-to-use-wpf-controls-with-simple-injector-dependencies – Steven