我让 Unity 2.0 在 App.xaml.cs 中运行良好,以便在该类中注册和解析。
我的问题是关于最佳实践。
我有许多用户控件和其他类,它们也需要解析一些相同的和新的接口(interface) <-> 实现。问题是无法访问我在 App.xaml.cs 中创建的 Unity 容器。
我不能使用构造函数或属性注入(inject)来传递容器引用。
- 太多了(这是一个大项目)
- 用户控件通过xaml添加
- 有几个非常松散 项目中的相关“模块” 可以共享同一个容器 配置。
我宁愿不从每个需要访问容器的对象中的配置文件重新创建容器。
当需要同一容器作为同一程序集的各种“模块”中的服务时,有什么最佳实践建议吗?
谢谢。
最佳答案
我相信将 Controls
和 IoC
放在一起是痛苦的……至少在代码中是这样。可能有人会争论,但 IMO 避免这种痛苦的最佳实践是 MVVM
。您将拥有可以使用 Unity
自由构建的 View 模型,并将您需要的一切注入(inject)其中。您将拥有与 viewModels 绑定(bind)的 View ,而没有理由知道任何控制反转。
更新:基于评论:
App.xaml.cs:
private void HandleStartup(object sender, StartupEventArgs e)
{
var container = CreateContainer(); // create IoC container
var mainViewModel = container.Resolve<MainViewModel>();
var shell = new Shell { DataContext = mainViewModel }; // main View
MainWindow = shell;
shell.Show();
}
外壳 XAML 示例:
<UserControl>
<StackPanel>
<ContentPresenter Content="{Binding ViewModel1}" />
<ContentPresenter Content="{Binding ViewModel2}" />
<ContentPresenter Content="{Binding ViewModel3}" />
</StackPanel>
</UserControl>
主视图模型:
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;
}
通过这种方式,您的 View 将不知道 IoC,并且您在 viewModels 中想要的一切都将被成功注入(inject)。
UPDATE2 DataTemplating 将 Views
和 ViewModels
结合在一起:
应用.xaml
<Application.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<View1 />
</DataTemplate>
</Application.Resources>
关于c# - 在 WPF 中使用 Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158970/