Wpf 将DI(Unity)与MVVM和XAML一起使用

Wpf 将DI(Unity)与MVVM和XAML一起使用,wpf,xaml,dependency-injection,unity-container,Wpf,Xaml,Dependency Injection,Unity Container,我非常了解如何使用Unity来实例化WPF应用程序的主窗口,以及如何使用UnityContainer将依赖项注入应用程序的顶层。我缺少的是如何在多层设计中使用这种方法 protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); using (IUnityContainer container = new UnityContainer()) {

我非常了解如何使用Unity来实例化WPF应用程序的主窗口,以及如何使用UnityContainer将依赖项注入应用程序的顶层。我缺少的是如何在多层设计中使用这种方法

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        using (IUnityContainer container = new UnityContainer())
        {
            DataSet dataModel = new DataSet();
            dataModel.Tables.Add(new DataTable("User"));
            dataModel.Tables["User"].Rows.Add(dataModel.Tables["User"].NewRow());
            container.RegisterInstance<IDataModel>(dataModel);
            var window = container.Resolve<MainWindow>();
            window.Show();
        }
    }
启动时受保护的覆盖无效(StartupEventArgs e)
{
基础。启动时(e);
使用(IUnityContainer container=new UnityContainer())
{
数据集数据模型=新数据集();
添加(新数据表(“用户”);
dataModel.Tables[“User”].Rows.Add(dataModel.Tables[“User”].NewRow());
容器.RegisterInstance(数据模型);
var window=container.Resolve();
window.Show();
}
}
例如,我有一个“用户”组合框控件,它出现在任意数量的对话框和网格控件中。此“用户”组合框使用“UserCollection”视图模型,该模型依赖于公共数据模型(出于所有目的,所有对话框和网格控件都使用共享数据集)。由于主窗口不控制网格控件或XAML定义控件的构造,我如何将公共数据模型注入到该可重用的“USER集合”视图模型?

中,您应该考虑。在视图模型优先的方法中,依赖项将被注入到视图模型中,并且视图模型将公开视图绑定到的属性

因此,例如,要从共享资源在视图上填充
组合框
,您可能需要将某种形式的服务或存储库(或工作单元)注入视图模型,以检索项目:

public class MyViewModel(IUserRepository userRepository)
{
    this.userRepository = userRepository;
}

private void PointAtWhichYouWantToPopulateTheCollection()
{
    this.Users = new ObservableCollection(this.userRepository.GetUsers());
}

public ObservableCollection<User> Users
{
    get 
    {
        return this.users;
    }

    set
    {
        this.users = value;
        // notify of property change here
    }
}
公共类MyViewModel(IUserRepository userRepository)
{
this.userRepository=userRepository;
}
您希望填充集合()的私有无效点
{
this.Users=newobserveCollection(this.userRepository.GetUsers());
}
公共可观测收集用户
{
得到
{
将此文件返回给用户;
}
设置
{
这是用户=价值;
//在此处通知物业变更
}
}

在您的视图中,然后将
组合框
项资源
绑定到视图模型上的
用户
集合。在IUserRepository的实现中,您需要执行数据访问代码<例如,code>GetUsers可能会返回一个
IEnumerable

谢谢您的建议,但我使用的是MVVM设计模式。我需要你帮我把这些点连起来。假设我的组合框有一个名为“UserCollection”的视图模型。这个“UserCollection”视图模型依赖于共享数据集,我们回到了原始问题:如何实例化这个从主窗口向下几层的视图模型?答案已更新。我强烈建议您使用MVVM框架。现在让我们假设我们有一个名为“管理用户”的对话框。在此对话框中,我们有“用户”组合框,它使用“MyViewModel”作为其视图模型(并绑定到“Users”属性)。我的问题是,鉴于原始帖子中的“dataModel”声明以及我们使用的是Unity,我们如何在此对话框中实例化MyViewModel,使其使用公共数据集?用户服务或存储库的实现将具有数据集逻辑。您可能不应该使用数据集,但这是另一个讨论。如果您希望在整个应用程序中使用相同的服务实例,则应将其注册为单一实例,否则,如果您希望在视图模型子集之间共享实例,则可以使用视图模型工厂。(1)这是MVVM,而不是MVC。你在说什么?这是一个简单的模式,我不觉得您实际上已经为它实现了Unity,因为您在这个基本问题上一直在绕圈子:Unity容器实例如何在一个简单的MVVM应用程序中传递到对话框?(2) 我到底为什么不想使用数据集呢?我有很多这类的东西和各种各样的选择,我尝试选择插件模块,其中“公共数据模型”在容器控制的生命周期中注册。其次,我将使用一个由所有Vm共享的状态。最后,我将使用服务定位器(尽管是不情愿的)。这有什么用吗?加里,没有,除非你能在这些通用说明背后提供一些具体的想法,否则它没有任何用处。你用什么容器?对话框或网格控件如何访问容器?此模式是否使用静态容器或服务定位器?您的问题是:我使用Unity。每个ViewModel都有一个构造函数,它需要容器实例作为参数,VM本身由Unity“解析”(而不是创建)。由于Unity也知道“公共数据模型”,所以每个VM都可以在其上解析并访问它,但我喜欢Unity在构建每个VM时在其上解析。最后,该模式既不使用静态容器也不使用服务定位器,而是从前到后使用经典的DI。一切都在类型注册阶段完成。这更有帮助吗?我不想输入示例代码,直到我确定它会有帮助。这也将是一个非常温和的代码,突出了核心问题,而不是整个enchillada。