我让Unity 2.0在App.xaml.cs中运行良好,可以在该类中注册和解析。
我的问题是关于最佳做法。
我有许多用户控件和其他类也需要解决一些相同的新接口< - >实现。问题是无法访问我在App.xaml.cs中创建的Unity容器。
我不能使用构造函数或属性注入来传递容器引用。
我宁愿不在每个需要访问容器的对象的配置文件中重新创建容器。
在同一个程序集的各个“模块”中需要同一个容器作为服务时,是否有任何最佳实践建议?
感谢。
答案 0 :(得分:4)
我认为将Controls
和IoC
放在一起至少是代码中的痛苦。可能有人会争辩,但IMO避免这种痛苦的最佳做法是MVVM
。您将拥有可以使用Unity
自由构建的viewModel,并将所需内容注入其中。您将拥有与viewModel绑定的视图,而没有理由知道任何大量的控制反转。
更新:根据评论:
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();
}
Shell XAML示例:
<UserControl>
<StackPanel>
<ContentPresenter Content="{Binding ViewModel1}" />
<ContentPresenter Content="{Binding ViewModel2}" />
<ContentPresenter Content="{Binding ViewModel3}" />
</StackPanel>
</UserControl>
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
<Application.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<View1 />
</DataTemplate>
</Application.Resources>