使用DI(Unity)与MVVM和XAML

时间:2013-08-09 14:23:08

标签: wpf xaml dependency-injection unity-container

我非常清楚如何使用Unity来实例化WPF应用程序的MainWindow,以及如何使用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();
        }
    }

例如,我有一个'User'ComboBox控件,它出现在任意数量的对话框和网格控件中。这个'User'组合框使用'UserCollection'视图模型,该模型依赖于公共数据模型(对于所有意图和目的,所有对话框和网格控件使用的共享DataSet)。由于主窗口不控制网格控件或XAML定义的控件的构造,如何将我的公共数据模型注入到这个可重用的“UserCollection”视图模型中?

1 个答案:

答案 0 :(得分:1)

您应该考虑MVVM design patternusing an MVVM framework。在视图模型第一种方法中,您的依赖项将被注入到视图模型中,您的视图模型将公开视图绑定的属性。

因此,例如,要从共享资源填充视图中的ComboBox,您可能希望注入某种形式的服务或存储库(或工作单元),以便将您的项目检索到视图模型中:

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
    }
}

在您的视图中,您可以将ItemsSource的{​​{1}}绑定到视图模型上的ComboBox集合。在IUserRepository的实现中,您将执行数据访问代码。例如Users可能会返回GetUsers