为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的 Autofac 注册的 Prism EventAggregator 没有正确注入到视图模

为什么我的 Autofac 注册的 Prism EventAggregator 没有正确注入到视图模

C#
ibeautiful 2023-04-29 15:45:08
在我的解决方案中,我也使用Autofac和Prism。下面是一个简化的项目,解释了会发生什么。我正在注册我的视图、视图模型和Autofac的容器类EventAggregator:public class BootStrapper        {            public IContainer BootStrap()            {                var builder = new ContainerBuilder();                builder.RegisterType<EventAggregator>()            .As<IEventAggregator>().SingleInstance();                builder.RegisterType<MainWindow>().AsSelf();                builder.RegisterType<ChildView1>().AsSelf();                builder.RegisterType<MainViewModel>().AsSelf();                builder.RegisterType<Child1ViewModel>().AsSelf();                return builder.Build();            }        }请注意,将视图模型注册为单例时,效果是相同的。我EventAggregator像这样注入我的虚拟机:public class MainViewModel    {        private IEventAggregator _eventAggregator;        public MainViewModel(IEventAggregator eventAggregator)        {            _eventAggregator = eventAggregator;            UpdateName("Name1");        }        public void UpdateName(string name)        {            ChildView1 win1 = new ChildView1(); //in the backend Child1ViewModel is assigend to its DataContext            win1.Show();            _eventAggregator.GetEvent<UpdateNameEvent>().Publish(name); //this does not work        }    }上面的代码不起作用。因为某些原因(希望大家告诉我原因),在执行UpdateName方法时,这个依赖不起作用,Child1ViewModel类内部的UpdateName方法没有被执行:public class Child1ViewModel : ViewModelBase    {        private IEventAggregator _eventAggregator;        public Child1ViewModel(IEventAggregator eventAggregator)        {            _eventAggregator = eventAggregator;            _eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);        }        private string _name;        public string Name        {            get            {                return _name;            }            set            {                _name = value;                OnPropertyChanged();            }        }
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

我假设您正在使用 Prism 的 ViewModelLocator 机制。我的假设是基于您手动实例化ChildView1而不是使用依赖注入容器解析它,并在评论中声明 viewModel 在后台解析。


您必须更改用于解析 ViewModel 实例的 Prism ViewModelLocator 容器,如下所示。


ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType) =>

{

    return YourAutofacContainer.Resolve<viewModelType>();

});


请记住,为了在整个应用程序中保持对象实例的单实例生命周期范围一致,您必须使用相同的依赖注入容器实例来解析对象和此对象的父对象,一直到根对象。


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信