代码之家  ›  专栏  ›  技术社区  ›  Hakan Fıstık MuriloKunze

将Unity属性依赖项注入与EventAggregator一起使用

  •  0
  • Hakan Fıstık MuriloKunze  · 技术社区  · 8 年前


    我有 BaseViewModel 所有ViewModel类都将从中继承

    public abstract class BaseViewModel : BindableBase
    {
        [Dependency]
        protected IEventAggregator EventAggregator { get; set; }
    
        // just default constructor, no other constructor is needed
    }
    

    下面是一个ViewModel类的示例

    public class TablesViewModel : BaseViewModel
    {
        public TablesViewModel()
        {
            EventAggregator.GetEvent<OperatorChangedEvent>().Subscribe(.....);
        }
    }
    

    以及以下类型的寄存器

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IEventAggregator>(new EventAggregator());       
    }
    

    BaseView模型 TablesViewModel 然后依赖属性由Unity DI设置,这是一个逻辑事件序列,但它不适合我。 建造者 表视图模型 由于 EventAggregator

    我不想使用构造函数依赖注入,这将迫使我为所有ViewModel类创建许多非默认构造函数。 同时,我需要订阅 在建造师那里(因为没有其他好的地方可以这样做,如果有请告诉我)。

    我该怎么解决这个问题

    2 回复  |  直到 8 年前
        1
  •  1
  •   Haukinger    8 年前

    我不想使用构造函数依赖注入,这将迫使我为所有ViewModel类创建许多非默认构造函数。

    你呢 具有依赖项的类的非默认构造函数。这就是依赖注入的全部内容:类型通过其构造函数参数告诉用户他必须给它们什么来操作。

    有很多方法可以使用非默认构造函数创建视图模型,例如Prism ViewModelLocator ServiceLocator 除非这是绝对必要的,但从技术上讲,一个邪恶的人可以这样做:

    public abstract class BaseViewModel : BindableBase
    {
        protected IEventAggregator EventAggregator { get; } = ServiceLocator.Current.GetInstance<IEventAggregator>();
    }
    
        2
  •  1
  •   mm8    8 年前

    不能 在创建类的实例之前设置,即 EventAggregator 在构造函数执行之前,永远不会设置属性。

    如果需要访问构造函数中的事件聚合器,则应该使用构造函数依赖项注入或从某个静态属性检索事件聚合器。

    推荐文章