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