我对 DI 很陌生,我有几个问题希望人们能帮我解决,我目前正在使用 MEF 容器开发使用 Caliburn Micro 的 WPF-MVVM 系统。
此应用程序用于跟踪货物并有几个部分。我希望我能解释得足够清楚,但如果不清楚,请指出。
我有几个从数据库(通过 Web 服务)返回的实体,例如shipments
, containers
, packages
.
对于这些实体中的每一个,我都有一个包装 web 服务实体的模型和一个管理器,管理器负责通过 web 服务进行标准 CRUD 操作,以及存储模型ObservableCollection
的,然后将这些管理器注入到该构造函数中需要访问这些列表。viewmodels
所以,我有shipping > shippingManager > shippingListViewModel,这样做是为了允许对同一个货件列表进行多项工作viewmodels
但是,我已经开始遇到一些问题,其中一些viewmodels
具有包含 6 个以上管理器的构造函数,而有些情况仅用于传递新构造dialog viewmodels
的 .
我希望有人可以为这个问题提出一个干净的解决方案,我正在考虑一个将成为所有管理器的容器的类,然后我可以简单地注入该容器类并使用它来获得所需的管理器,但是我看到有人建议反对这种方法,但没有明确说明原因。
另外,另一个问题是,我的模型实现了IEditableObject
,并且因为我的经理负责维护模型列表,以及保存对这些模型的更改,所以在其中发布经理选择的事件EndEdit
会是一个问题吗?
编辑:要求的代码:
引导程序创建并导出所需的类:
protected override void Configure()
{
container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
CompositionBatch batch = new CompositionBatch();
IEventAggregator eventAggregator = new EventAggregator();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(eventAggregator);
batch.AddExportedValue<IManager<ShipmentContainer>>(new ContainerManager());
batch.AddExportedValue<IManager<Item>>(new ItemManager());
batch.AddExportedValue<IManager<OrderedItem>>(new OrderedItemManager());
batch.AddExportedValue<IManager<Package>>(new PackageManager());
batch.AddExportedValue<IManager<Proforma>>(new ProformaManager(eventAggregator));
batch.AddExportedValue<IManager<Project>>(new ProjectManager());
batch.AddExportedValue<IManager<Shipment>>(new ShipmentManager(eventAggregator));
batch.AddExportedValue<IManager<PackingItem>>(new PackingListManager(eventAggregator));
batch.AddExportedValue(container);
container.Compose(batch);
}
ContentViewModel 处理了菜单点击,它允许打开几个diaglogs,构造函数包含大量的DI:
public LBLContentViewModel(IWindowManager windowManager, IManager<Project> pManager, IEventAggregator eventManager, IManager<Item> iManager, IManager<PackingItem> plManager, IManager<Shipment> sManager)
{
...
}
和对话框显示如下:
public void OpenProject()
{
ProjectSearchViewModel viewModel = new ProjectSearchViewModel(_eventAggregator, _projectManager);
this._windowManager.ShowDialog(viewModel);
}
希望这是您想看到 charleh 的代码,如果不是,请告诉我,我会尽力提供所需的。