编程语言
首页 > 编程语言> > CodeGo.net>如何处理MVVM应用程序中的构造函数过度注入

CodeGo.net>如何处理MVVM应用程序中的构造函数过度注入

作者:互联网

我一直在阅读有关构造函数注入过多的问题.
完全有道理,这是未正确遵循SRP等的标志.(顺便说一下,我正在使用Ninject!)

但是,我很难理解如何解决我的问题.
最大的问题是在我的视图模型中,我在其中注入要与我的属性一起使用的DTO映射器和存储库.

这是我的视图模型构造函数的示例:

public MainViewModel(
        IGenericRepository<MainDbContext, Product> productRepository,
        IGenericRepository<MainDbContext, Person> personRepository,
        IGenericRepository<MainDbContext, Order> orderRepository,
        ProductMapper productMapper,
        PersonMapper personMapper,
        OrderMapper orderMapper,
        IViewModelLoader viewModelLoader, 
        IEventAggregator eventAggregator)
    {
        _productRepository = productRepository;
        _personRepository = personRepository;
        _orderRepository = orderRepository;
        _productMapper = productMapper;
        _personMapper = personMapper;
        _orderMapper = orderMapper;
        _viewModelLoader = viewModelLoader;
        _eventAggregator = eventAggregator;

        _eventAggregator.Subscribe(this);

    }

我的猜测是我没有正确使用存储库/映射器,应该将它们从视图模型中移出……我不确定确切的位置或方式.
这是我提出问题的原因.

该应用程序的体系结构如下所示:

Company.Product.Core
Company.Product.DataAccess
Company.Product.Domain
Company.Product.Presentation

GenericRepository放置在Company.Product.DataAccess.Repositories内部
和Company.Product.Domain.Mappers中的映射器

解决方法:

查看构造函数列表,看起来事情成对出现:

> productRepository / productMapper
> personRepository / personMapper
> orderRepository / orderMapper

这似乎表明MainViewModel构成了与产品,人员和订单有关的内容.

您是否可以对其建模,以使其组成其他三个视图模型?假设的ProductViewModel,PersonViewModel,OrderViewModel类..?

甚至必须完全是这三个类吗? MainViewModel可以代替其他任何View模型吗?

这样可以将构造函数简化为:

public MainViewModel(
    IReadOnlyCollection<IViewModel> viewModels,
    IViewModelLoader viewModelLoader, 
    IEventAggregator eventAggregator)

这似乎更合理.

从本质上讲,这将是Composite pattern的实现,通常很自然地适合于UI建模-通常将其称为Composite UI.

使我感到疑惑的另一件事是IVewModelLoader的功能是什么?

标签:constructor,dependency-injection,ninject,c,mvvm
来源: https://codeday.me/bug/20191027/1947773.html