gpt4 book ai didi

c# - 如何使用 MvvM 应用依赖注入(inject)?

转载 作者:行者123 更新时间:2023-11-30 12:40:34 24 4
gpt4 key购买 nike

我读过 Mark Seemann 的书 Dependency Injection in .NET。我想我理解他写的大部分内容。

我正在努力解决的问题是我想将 View 模型注入(inject) View 。我知道这可以通过

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

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

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

最佳答案

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

关于c# - 如何使用 MvvM 应用依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41378060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com