我该如何在Mvvm中应用依赖注入?

4

我看过Mark Seemann的书《.NET中的依赖注入》。我认为我理解了他所写的大部分内容。

我现在遇到的问题是,我想将viewmodels注入到views中。 我知道可以通过

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命名为一项资源。

我的问题是,这样做是否是良好的依赖注入?或者这仍然是服务定位器模式(这是一种反模式,因此我不想使用它)

如果这是反模式,我有哪些选项?


相关链接:https://dev59.com/-I7ea4cB1Zd3GeqPDp9R - Steven
1个回答

1
您的解决方案看起来对我来说是完全有效的。事实上,这就是MVVM light library中使用的相同方法(CompositionRoot被命名为ViewModelLocator)。重要的是,定位器仅用于将视图绑定到视图模型时使用,不应注入到视图模型中(这将是您试图避免的服务定位器模式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接