2016-12-29 4 views
3

Mark Seemannの書籍Dependency Injection in .NETを読んだことがあります。そして私は彼が書いたことのほとんどを理解していると思う。MvvMでI依存性注入を適用するにはどうすればよいですか?

私が苦労している問題は、ビューモデルをビューに挿入したいということです。 私はこれが

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(); 
    } 
} 

によって行うことができます知っているが、これはむしろ、粗ようです。

私が考えていた

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>(); } 
    } 
} 

そして、XAMLコード

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

(app.xamlに私はcompositerootがのIoCなどのリソース命名されています)

に入れます

私の質問は今、これは良いDependency Injectionか、これはまだサービスロケータパターン(これはアンチパターンなので使用したくないでしょう)

これが反パターンの場合は、私のオプションは何ですか?

+0

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

答えて

1

あなたのソリューションは私にとって完全に有効です。実際、これはMVVM light libraryCompositionRootは代わりにViewModelLocatorと命名されています)で使用されているのと同じ方法です。重要な点は、ロケータは、ビューをモデルを表示するためにバインドするときにのみ使用するためであり、ビューモデルに注入しないでください(これは回避しようとしているservice locator patternです)。

関連する問題