簡體   English   中英

如何使用MvvM應用I依賴注入?

[英]How do apply I Dependency Injection with MvvM?

我讀過Mark Seemann的書“依賴注入在.NET中”。 而且我想我理解他寫的大部分內容。

我遇到的問題是我想將視圖模型注入視圖中。 我知道這可以通過

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資源)

我現在的問題是,這是一個很好的依賴注入,還是這仍然是服務定位器模式(這是一種反模式,所以我不想使用它)

如果這是反模式,我的選擇是什么?

您的解決方案對我來說非常有效。 實際上,這與MVVM光庫中使用的方法相同( CompositionRoot被命名為ViewModelLocator )。 重要的一點是定位器只是在將視圖綁定到視圖模型時使用,不應該注入到視圖模型中(這將是您試圖避免的服務定位器模式 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM