Hou*_*man 6 .net c# prism mef prism-4
我正在运行最新的PRISM 4.2.不幸的是,文档中的Event Aggregator教程是通过Unity而不是MEF驱动的.我不能让它在MEF下运行.
App.xaml.cs
public partial class App : Application
{
[Import]
public IEventAggregator eventAggregator;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
Bootstrapper.cs
public class Bootstrapper : MefBootstrapper
{
protected override DependencyObject CreateShell()
{
return new MainWindow();
}
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly));
}
protected override IModuleCatalog CreateModuleCatalog()
{
ModuleCatalog moduleCatalog = new ModuleCatalog();
return moduleCatalog;
}
}
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs
public partial class MainWindow : Window, IView
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
}
Run Code Online (Sandbox Code Playgroud)
MainViewModel.cs:
[ModuleExport(typeof(MainViewModel))]
public class MainViewModel : BindableBase, IServiceCallback
{
[Import]
public IEventAggregator eventAggregator;
[ImportingConstructor]
public MainViewModel()
{
eventAggregator.GetEvent<AppExitEvent>().Publish("");
}
}
Run Code Online (Sandbox Code Playgroud)
尽管[import]事件聚合器在App.xaml.cs和MainViewModel中始终为null.这是为什么?
第二个问题是我是否必须将我的Viewmodels导出为模块(如上所述)以在其中使用均匀聚合器?
更新:
证明最新版本的PRISM不再支持ComposeExportedValue.

'System.ComponentModel.Composition.Hosting.CompositionContainer'不包含'ComposeExportedValue'的定义,也没有扩展方法......
解决这个问题的方法是SchubertJ在CodePlex的同一个问题上回答的问题:
作为更深入的分析,在构造函数完成之前,不会解析Properties上的Import属性.这就是为什么你需要通过构造函数注入EventAggregator依赖项作为参数,如果这个依赖项将用于构造函数实现.
因此,如果要在ViewModel构造函数上使用EventAggregator依赖项,则应使用[ImportConstructor]属性,并通过将其作为参数进行检索,向容器请求EventAggregator实例:
public class MainViewModel
{
private readonly IEventAggregator eventAggregator;
[ImportingConstructor]
public MainViewModel(IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
this.eventAggregator.GetEvent<MyEvent>().Publish("");
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在以下帖子中找到有关这两种导入替代方案的更多相关信息:
我希望这对你有所帮助,问候.
| 归档时间: |
|
| 查看次数: |
2970 次 |
| 最近记录: |