我一直在阅读有关构造函数过度注入的问题。 这一切都是有道理的,这是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
答案 0 :(得分:4)
查看构造函数列表,看起来事物成对出现:
productRepository
/ productMapper
personRepository
/ personMapper
orderRepository
/ orderMapper
这似乎表明MainViewModel
组成了与产品,人员和订单相关的东西。
您可以改为对其进行建模,以便它构成其他三个View模型吗?假设ProductViewModel
,PersonViewModel
,OrderViewModel
类......?
它甚至必须是这三个类吗? MainViewModel
可以组成任意数量的其他视图模型吗?
这会将构造函数减少到这样:
public MainViewModel(
IReadOnlyCollection<IViewModel> viewModels,
IViewModelLoader viewModelLoader,
IEventAggregator eventAggregator)
这似乎更合理。
这基本上是Composite pattern的实现,它通常很适合UI建模 - 它通常被称为复合UI 。
令我惊讶的另一件事是IVewModelLoader
做了什么?