如何在MVVM应用程序中处理构造函数的过度注入

时间:2015-09-23 17:24:19

标签: c# mvvm constructor dependency-injection ninject

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

但是,我很难理解如何在我的案例中解决这个问题。 最大的问题是在我的viewmodel中,我注入DTO映射器和存储库以与我的属性一起使用。

以下是我的viewmodel构造函数的示例:

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中 和公司内部的地图集.Product.Domain.Mappers

1 个答案:

答案 0 :(得分:4)

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

  • productRepository / productMapper
  • personRepository / personMapper
  • orderRepository / orderMapper

这似乎表明MainViewModel组成了与产品,人员和订单相关的东西。

您可以改为对其进行建模,以便它构成其他三个View模型吗?假设ProductViewModelPersonViewModelOrderViewModel类......?

它甚至必须是这三个类吗? MainViewModel可以组成任意数量的其他视图模型吗?

这会将构造函数减少到这样:

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

这似乎更合理。

这基本上是Composite pattern的实现,它通常很适合UI建模 - 它通常被称为复合UI

令我惊讶的另一件事是IVewModelLoader做了什么?