如何在 MVVM 应用程序中将 EventAggregator 注册为单例?
How do I register an EventAggregator as a singleton in an MVVM app?
构建我的第一个 MVVM 应用程序,它引入了一些非常强大的概念,但同时要立即学习很多东西。我现在遇到的问题是,当我从另一个 ViewModel 发布事件时,事件订阅者似乎没有收到事件。
我想我需要在 App.xaml.cs 或我的 BootStrapper
class 中 new
创建一个 EventAggregator,然后将该实例注入到需要引用它的每个 ViewModel 中.我认为正在发生的事情是为每个视图模型创建一个新的 IEventAggregator
,而我 pubbing/subbing 到不同的实例。不确定我的断开连接是与此处的 EventAggregator Pattern/Prism 还是 DI/Autofac。
我应该这样做吗:
public partial class App : Application
{
//Add this...
IEventAggregator eventAggregator = new EventAggregator();
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//... and pass in here somehow?
var window = new BootStrapper()
.Bootstrap()
.Resolve<AView>();
window.Show();
}
}
或者像这样:
public class BootStrapper
{
//Add this...
IEventAggregator eventAggregator = new EventAggregator();
public IContainer Bootstrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<AView>()
.AsSelf();
builder.RegisterType<AViewModel>()
.AsSelf();
builder.RegisterType<OtherViewModel>()
.As<IOtherViewModel>();
builder.RegisterType<ADataProvider>()
.As<IADataProvider>();
builder.RegisterType<ADataService>()
.As<IDataService<Account>>();
//What I'm doing now
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>();
//...and register instance here?
builder.RegisterType<AccountSelectedEvent>()
.AsSelf();
return builder.Build();
}
在正确方向上的建议、参考或推动同样值得赞赏。谢谢!
尝试从现有的 container-specific 引导程序派生您的引导程序,该引导程序为您完成所有棱镜注册,或者从一个新的 container-specific PrismApplication
类 将在未来的棱镜版本中取代引导程序。
试试 Prism Template Pack,它会为您创建一个最小的可用应用程序。
我想通了,而且……简单得令人尴尬。在我的 BootStrapper
之前
Type 注册正常,但每次请求实例时都会注入一个新实例,所以我是 pubbing
一个,subbing
另一个。
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>();
之后
我的天啊
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>()
.SingleInstance;
构建我的第一个 MVVM 应用程序,它引入了一些非常强大的概念,但同时要立即学习很多东西。我现在遇到的问题是,当我从另一个 ViewModel 发布事件时,事件订阅者似乎没有收到事件。
我想我需要在 App.xaml.cs 或我的 BootStrapper
class 中 new
创建一个 EventAggregator,然后将该实例注入到需要引用它的每个 ViewModel 中.我认为正在发生的事情是为每个视图模型创建一个新的 IEventAggregator
,而我 pubbing/subbing 到不同的实例。不确定我的断开连接是与此处的 EventAggregator Pattern/Prism 还是 DI/Autofac。
我应该这样做吗:
public partial class App : Application
{
//Add this...
IEventAggregator eventAggregator = new EventAggregator();
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
//... and pass in here somehow?
var window = new BootStrapper()
.Bootstrap()
.Resolve<AView>();
window.Show();
}
}
或者像这样:
public class BootStrapper
{
//Add this...
IEventAggregator eventAggregator = new EventAggregator();
public IContainer Bootstrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<AView>()
.AsSelf();
builder.RegisterType<AViewModel>()
.AsSelf();
builder.RegisterType<OtherViewModel>()
.As<IOtherViewModel>();
builder.RegisterType<ADataProvider>()
.As<IADataProvider>();
builder.RegisterType<ADataService>()
.As<IDataService<Account>>();
//What I'm doing now
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>();
//...and register instance here?
builder.RegisterType<AccountSelectedEvent>()
.AsSelf();
return builder.Build();
}
在正确方向上的建议、参考或推动同样值得赞赏。谢谢!
尝试从现有的 container-specific 引导程序派生您的引导程序,该引导程序为您完成所有棱镜注册,或者从一个新的 container-specific PrismApplication
类 将在未来的棱镜版本中取代引导程序。
试试 Prism Template Pack,它会为您创建一个最小的可用应用程序。
我想通了,而且……简单得令人尴尬。在我的 BootStrapper
之前
Type 注册正常,但每次请求实例时都会注入一个新实例,所以我是 pubbing
一个,subbing
另一个。
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>();
之后
我的天啊
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>()
.SingleInstance;