C# 在Prism 4中查看注入并避免依赖

C# 在Prism 4中查看注入并避免依赖,c#,wpf,prism,C#,Wpf,Prism,目前我正在学习棱镜。我正在构建测试应用程序,我需要在单击按钮时将视图注入区域。我知道如何在视图模型中使用此代码 IRegion region = _regionManager.Regions[RegionNames.TicketEditorRegion]; TicketEditorView view = _componentContainer.Resolve<TicketEditorView>(); region.Add(view); IRegion region=_region

目前我正在学习棱镜。我正在构建测试应用程序,我需要在单击按钮时将视图注入区域。我知道如何在视图模型中使用此代码

IRegion region = _regionManager.Regions[RegionNames.TicketEditorRegion]; 
TicketEditorView view = _componentContainer.Resolve<TicketEditorView>();
region.Add(view);
IRegion region=_regionManager.Regions[RegionNames.TicketEditorRegion];
TicketEditorView=_componentContainer.Resolve();
区域。添加(视图);
问题是我需要在模块之间添加引用。我想这是不可取的。 我可以通过为某些RegionBuilderThing添加接口并使用unity在视图模型中解析它来避免这种情况

那么,这是一个好方法吗?如果是的话,如何命名这个区域为BuilderThing(遵循一些设计模式/指导或其他人可以理解的东西)?
如果这不是一个好方法,那是什么?

理想情况下,您应该将ViewModel注入IRegion的Views集合,而不是视图。如果您在加载的ResourceDictionary中有一个DataTemplate(App.xaml与任何一个都一样好),那么ViewModel将作为适当的视图呈现。通过这种方式,您可以将ViewModel代码与用于在屏幕上渲染它的任何视图的任何知识完全分离

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}">
    <views:MyView />
</DataTemplate>


除此之外,我认为您不需要这样的RegionBuilder。

理想情况下,您应该将ViewModel注入IRegion的Views集合,而不是视图。如果您在加载的ResourceDictionary中有一个DataTemplate(App.xaml与任何一个都一样好),那么ViewModel将作为适当的视图呈现。通过这种方式,您可以将ViewModel代码与用于在屏幕上渲染它的任何视图的任何知识完全分离

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}">
    <views:MyView />
</DataTemplate>


除此之外,我认为您不需要RegionBuilder。

在包含要注入的ViewModel的外部模块中,创建一个订阅特定EventAggregator事件(比如InjectChildEvent)的类,并将其作为单例加载到ComponentContainer中。InjectChildEvent可能将RegionName作为参数。在subscription方法中,解析ViewModel并将其注入区域

在主模块中,单击按钮时,发布InjectChildEvent EventAggregator事件的实例


这样,您就不必引用其他模块。您需要在基础设施项目中创建EventAggregator事件。

在包含要注入的ViewModel的外部模块中,创建订阅特定EventAggregator事件的类(例如InjectChildEvent),并将其作为单例加载到ComponentContainer中。InjectChildEvent可能将RegionName作为参数。在subscription方法中,解析ViewModel并将其注入区域

在主模块中,单击按钮时,发布InjectChildEvent EventAggregator事件的实例


这样,您就不必引用其他模块。您需要在基础设施项目中创建EventAggregator事件。

您肯定需要在某处添加引用。即使您有一个
ITicketEditorView
,您也需要指示容器将其解析为具体的
TicketEditorView
。在这一点上,您将需要引用。是的,但对于这一点,我有一个所有模块都有引用的基础设施项目(它用于常见类型)。您肯定需要在某个地方添加引用。即使您有一个
ITicketEditorView
,您也需要指示容器将其解析为具体的
TicketEditorView
。在这一点上,您需要引用。是的,但对于这一点,我有所有模块都有引用的基础设施项目(它用于常见类型)。好的,这很好,但我仍然需要引用模块项目中的视图模型(我试图避免引用)。好的,如果您确实坚决避免引用其他模块,我会添加另一个答案。好的,但我仍然需要引用模块项目中的视图模型(我正试图避免引用)。好的,如果您确实坚决避免引用其他模块,我添加了另一个答案。我发现在mvvm/prism应用程序中,这被称为控制器。关于它的更多信息可以在这里找到,我发现它在mvvm/prism应用程序中被称为控制器。更多关于它的信息可以在这里找到