在WPF中使用Unity
我让Unity 2.0在App.xaml.cs中运行良好,可以在该类中注册和解析。
我的问题是关于最佳做法。
我有许多用户控件和其他类,还需要解决一些相同和新的接口实现。 问题是无法访问我在App.xaml.cs中创建的Unity容器。
我不能使用构造函数或属性注入来传递容器引用。
- 太多了(这是一个大项目)
- 用户控件通过xaml添加
- 项目中有几个非常松散相关的“模块”可以共享相同的容器配置。
我宁愿不在每个需要访问容器的对象的配置文件中重新创建容器。
在同一组件的各种“模块”中需要同一个容器作为服务时,是否有任何最佳实践建议?
谢谢。
我认为将Controls
和IoC
结合在一起至少是代码中的痛苦。 可能有人会争辩,但IMO避免这种痛苦的最佳做法是MVVM
。 您将拥有viewModel,您可以使用Unity
自由构建并将所需内容注入其中。 您将拥有与viewModel绑定的视图,而没有理由知道任何大量的控制反转。
更新 :根据评论:
App.xaml.cs:
private void HandleStartup(object sender, StartupEventArgs e) { var container = CreateContainer(); // create IoC container var mainViewModel = container.Resolve(); var shell = new Shell { DataContext = mainViewModel }; // main View MainWindow = shell; shell.Show(); }
Shell XAML示例:
MainViewModel:
public class MainViewModel { public ViewModel1 ViewModel1 { get; private set; } public ViewModel2 ViewModel2 { get; private set; } public ViewModel3 ViewModel3 { get; private set; } // this will be handled by IoC container public MainViewModel(ViewModel1 viewModel1, ViewModel2 viewModel2, ViewModel3 viewModel3) { ViewModel1 = viewModel1; ViewModel2 = viewModel2; ViewModel3 = viewModel3; }
通过这种方式,您的视图将不会意识到IoC,并且将成功注入viewModel中您想要的所有内容。
UPDATE2 DataTemplating将Views
和ViewModels
结合在一起:
App.xaml中