如何使用MvvM应用I依赖注入?

时间:2016-12-29 10:43:47

标签: c# wpf mvvm dependency-injection

我已经阅读过Mark Seemann的书中的依赖注入。而且我想我理解他写的大部分内容。

我遇到的问题是我想将视图模型注入视图中。 我知道这可以通过

来完成
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资源)

我现在的问题是,这是一个很好的依赖注入,还是这仍然是服务定位器模式(这是一种反模式,所以我不想使用它)

如果这是反模式,我的选择是什么?

1 个答案:

答案 0 :(得分:1)

您的解决方案对我来说非常有用。实际上,这与MVVM light library中使用的方法相同(CompositionRoot被命名为ViewModelLocator)。重要的一点是定位器只是在将视图绑定到视图模型时使用,不应该注入到视图模型中(这将是您试图避免的service locator pattern)。