【问题标题】:How do apply I Dependency Injection with MvvM?如何使用 MvvM 应用依赖注入?
【发布时间】:2016-12-29 10:43:47
【问题描述】:

我读过 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 资源)

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

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

【问题讨论】:

标签: c# wpf mvvm dependency-injection


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2013-01-29
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多