在 Unity 容器(事件聚合器和对话服务)中注册多个类型时有什么问题?



我正在使用带有Prism的WPF。我是MVVM,Prism,DI容器等的新手。我正在尝试使用它们构建一个应用程序,以便学习和理解它们。

我已经使用Prism的事件聚合器,它工作正常。但是我也需要在大多数视图模型类(但不是全部(中使用Prism的新DialogService。

我希望有以下几点:

        private readonly IEventAggregator _eventAggregator;
        private readonly IDialogService _dialogService;
        public SomeViewModel(IEventAggregator ea, IDialogService dialog) 
        {
            // some other stuff here....
            _eventAggregator = ea;
            _dialogService = dialog;
        }

我在 C# Corner 的某个地方找到了一个静态类:

 public static class DependencyInjector
    {
        private static readonly UnityContainer UnityContainer = new UnityContainer();
        public static void Register<I, T>() where T : I
        {
            UnityContainer.RegisterType<I, T>(new ContainerControlledLifetimeManager());
        }
        public static void InjectStub<I>(I instance)
        {
            UnityContainer.RegisterInstance(instance, new ContainerControlledLifetimeManager());
        }
        public static T Retrieve<T>()
        {
            return UnityContainer.Resolve<T>();
        }
    }

以及我如何在 App.xaml 中使用它.cs:

  DependencyInjector.Register<IEventAggregator, EventAggregator>();
  DependencyInjector.Register<IDialogService, DialogService>();

无需注册DialogService(因此仅使用EventAggregator(,这工作正常。 但现在我得到了一个例外。

我该如何使用它?

我在 C# Corner 的某个地方找到了一个静态类:[...]以及我如何在 App.xaml 中使用它.cs:[...]我该如何使用它?

不要。只是报废它。棱镜提供您需要做的一切

 public SomeViewModel(IEventAggregator ea, IDialogService dialog) 

开箱即用。只需将ViewModelLocator.AutoWireViewModel="True";放入SomeView的 xaml 中,Prism 就会神奇地创建一个具有正确构造函数参数的SomeViewModel实例,并将其分配为数据上下文。

附带说明一下,如果你只是拿起并使用你偶然发现的你不理解的东西,人们会受到伤害。适用于汽车和爆炸物以及代码...

最新更新