我正在使用MVVM模式和Prism框架编写应用程序(Silverlight和WPF)。在我的应用程序中,我有一个包含客户列表的网格。在此之下,我提出了各种客户细节。所有信息都来自WCF服务,该服务提供来自查询的数据以及在接收到数据时触发事件的回调。当网格中的所选项目发生更改时,将更新详细信息。还有一个过滤视图,用于控制详细信息的日期范围。
我还需要实现一组类似的视图,但对于特定的客户。所提供的信息是相同的,因此显然最好重用相同的视图和模型类。
我最初的想法是为这两种方案构建一个独立的中间服务,它位于模型和WCF服务之间。然后,我会通过按名称注册实例来将模型绑定到特定服务。
不幸的是,这意味着我必须自己实例化很多类,而不是依赖我更喜欢的依赖注入。
那么,对于所有MVVM专家来说,如何构建视图,模型和服务以最好地利用Prism框架的功能并促进代码重用?
非常感谢!
====编辑:添加以下文字和示例====
这是一个简单的例子,我希望能解释我正在努力实现的目标。
public class CustomerViewModel : ICustomerViewModel
{
public ICustomerView View { get; private set; }
private readonly ICustomerService customerService { get; set; }
private Customer customer;
public CustomerViewModel(ICustomerView view, ICustomerService service, IEventAggregator eventAggregator)
{
customerService = service;
eventAggregator.GetEvent<SelectedCustomerChangedEvent>().Subscribe(CustomerChanged);
eventAggregator.GetEvent<CustomerInfoUpdatedEvent>().Subscribe(CustomerUpdated);
View = view;
View.Model = this;
}
public string Name
{
get
{
return customer.Name;
}
}
public string Email
{
get
{
return customer.Email;
}
}
public void CustomerChanged(int customerId)
{
customerService.RequestCustomerInfo(customerId);
}
public void CustomerUpdated(Customer customer)
{
this.customer = customer;
}
}
此客户视图模型基于客户在网格中的当前设计。选择客户会触发SelectedCustomerChangedEvent,这将导致视图模型请求信息。
它是从使用回调机制提供数据的基础WCF服务提供的(数据可能需要很长时间才能检索/计算,因此简单的WCF调用将不起作用)。这很好用。问题是我想在应用程序的不同区域重用相同的视图和模型,该区域显示有关特定客户的信息,而不是当前选定的客户。
我最初的想法是创建一个中间服务,处理列表的SelectedCustomerChangedEvent以及打开客户特定视图时的类似事件。然后,它将通过相同的CustomerInfoUpdatedEvent为模型提供数据。
问题在于,由于我现在有两个实现相同接口的服务,我需要命名它们,然后让视图模型知道从容器中检索哪一个。
我知道我可能犯了设计错误。好消息是我有时间修复它,但我不确定如何解决它。
答案 0 :(得分:0)
如果所有客户(包括您的特定客户)的Customer
类相同,则使用单个服务,相同的视图和相同的模型。
你能告诉我们为什么这不起作用吗?
答案 1 :(得分:0)
没有理由像你想的那样使这复杂化。感觉就像是从WCF服务接收回调事件......我是对的吗?如果是这样,如果传入的WCF回调属于用户正在查看的客户,则需要更新UI。我将根据这些假设工作......如果我误解了,请告诉我。
我认为你几乎拥有你需要的东西。我想你需要做的就是:
同样,这是我努力理解你想要完成的事情。如果不是,请告诉我们。