我已经阅读过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资源)
我现在的问题是,这是一个很好的依赖注入,还是这仍然是服务定位器模式(这是一种反模式,所以我不想使用它)
如果这是反模式,我的选择是什么?
答案 0 :(得分:1)
您的解决方案对我来说非常有用。实际上,这与MVVM light library中使用的方法相同(CompositionRoot
被命名为ViewModelLocator
)。重要的一点是定位器只是在将视图绑定到视图模型时使用,不应该注入到视图模型中(这将是您试图避免的service locator pattern)。