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

在我的解决方案中,我也使用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();

            }

        }



ibeautiful
浏览 234回答 1
1回答

交互式爱情

我假设您正在使用 Prism 的 ViewModelLocator 机制。我的假设是基于您手动实例化ChildView1而不是使用依赖注入容器解析它,并在评论中声明 viewModel 在后台解析。您必须更改用于解析 ViewModel 实例的 Prism ViewModelLocator 容器,如下所示。ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType) =>{    return YourAutofacContainer.Resolve<viewModelType>();});请记住,为了在整个应用程序中保持对象实例的单实例生命周期范围一致,您必须使用相同的依赖注入容器实例来解析对象和此对象的父对象,一直到根对象。
打开App,查看更多内容
随时随地看视频慕课网APP