我非常清楚如何使用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”视图模型中?
答案 0 :(得分:1)
您应该考虑MVVM design pattern和using 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
。