正确哦现在我相信我已经设置了这个应用程序,但如果我错了,请纠正我,为了简单起见,我在我的引导程序中加载了3个模块,一个是导航模块,另外两个是视图。
如果我加载模块,并且在初始化方法中将它们添加到一个完全正常工作的区域,那么在代码中是独立的,但是当然还有更多的控制权。
现在在导航视图模型中,我有一个事件聚合器,它发布一个事件(如果重要的话,继承自EventArgs的类)其他两个模块已订阅此事件但未收到它,
/// <summary>
/// Carries the out menu item selection methods.
/// </summary>
/// <param name="e">The <see cref="TMBL.Web.TMBLCore.Controls.Assets.NavigationViewSelectionEventArgs"/> instance containing the event data.</param>
public void CarryOutMenuItemSelectionMethods(NavigationViewSelectionEventArgs e)
{
_eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Publish(e);
}
在导航ViewModel中,然后在新闻模块中订阅
_eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Subscribe(NavigationMenuReturnedEvent,
ThreadOption.UIThread);
看起来很简单,我可以在我的导航模块中订阅此事件并将其选中,它只是不在模块之外,需要做些什么来实现这一目标?
事件聚合器也通过依赖注入推送到模块构造函数,然后存储在那里并通过构造函数传递给视图和视图模型(顺便说一下,视图是第一种方法)。虽然我在这里,我不知道这是否是问题的原因,但是让模块存储事件聚合器的实例并以这种方式传递它是不好的,例如
_displayNewsView = new DisplayNewsView(new DisplayNewsViewModel(_eventAggregator));
或者事件聚合器应该以不同的方式访问视图模型吗?
谢谢你的时间
答案 0 :(得分:3)
您正在正确注入事件聚合器,但您需要检查几件事。
1)事件聚合器实例是否为应用程序的全局,而不是由每个模块创建。必须跨模块使用相同的实例。这应该在应用程序引导程序中创建并传递给每个模块。
2)NavigationMenuItemSelectionEvent是在跨模块共享的公共程序集中定义的吗?如果是这种情况(正如我所料)那么请确保跨模块使用相同的程序集。使用调试器加载应用程序时可以检查此项,并使用“模块”窗口(Debug&gt; Windows菜单)查看加载的程序集。该程序集只应列出一次。
如果您看到多次加载了公共程序集,那么可能是因为您正在从不同目录加载模块而且公共程序集未签名。 .Net会将这些视为独立的,因此NavigationMenuItemSelectionEvent类型将不匹配。
要么组件已签名,要么确保所有模块使用相同的程序集实例,要么确保所有模块都从同一目录加载(如果它也使用公共程序集,则包括应用程序)。
答案 1 :(得分:1)
好的堆栈溢出丢失了我的好回复。所以我需要在我的引导程序中使用事件聚合器实例,因为所有模块都需要使用相同的服务,这对我来说很有意义。但是我认为依赖注入会解决这个问题,我需要在我的引导程序中使用事件聚合器的实例?我的问题首先是如何实现它的两个方面
protected override DependencyObject CreateShell()
{
_eventAggregator = new EventAggregator();
var shell = Container.Resolve<Shell>();
Application.Current.RootVisual = shell;
return shell;
}
那会有用吗?其次,如何将此实例传递给引导过滤器中的模块,因为当它们被添加到模块目录时,我相信
protected override IModuleCatalog GetModuleCatalog()
{
var catalog = new ModuleCatalog();
catalog.AddModule(typeof(TMBLCoreModule), InitializationMode.WhenAvailable);
catalog.AddModule(typeof(NewsModule), InitializationMode.WhenAvailable);
catalog.AddModule(typeof(UserModule), InitializationMode.WhenAvailable);
return catalog;
}
然后我如何将事件聚合器传递到每个模块中。我有一个快速的谷歌,但还没能找到这个信息,抱歉我的无知