0

我正在使用 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 向模型提供数据。

问题是,由于我现在有 2 个服务实现了相同的接口,我需要为它们命名,然后让视图模型以某种方式知道从容器中检索哪一个。

我知道我可能犯了设计错误。好消息是我有时间修复它,但我不知道如何修复它。

4

2 回答 2

0

如果Customer所有客户(包括您的特定客户)的类都相同,则使用单一服务、相同视图和相同模型。

你能告诉我们为什么这行不通吗?

于 2009-07-22T13:38:34.353 回答
0

嗯......这里有很多信息,但我会尝试一下。

确实没有理由像您尝试的那样使这件事复杂化。感觉就像您正在从 WCF 服务接收回调事件......我说的对吗?如果是这样,如果传入的 WCF 回调与用户正在查看的客户有关,则需要更新 UI。我会根据这些假设工作......如果我误解了,请告诉我。

我想你几乎有你需要的东西。我认为您需要做的就是以下几点:

  1. 在您的 WCF 回调处理程序中,使用 EventAggregator 引发一个事件,该事件将新客户信息与客户 ID 一起传递。
  2. 从任何 ViewModel 的构造函数中,订阅 CustomerUpdated 事件并为您在视图模型中查看的客户 ID 添加过滤器。您错过了这一点,但它很关键,否则您将获得大量与您的实例化 ViewModel 不一定相关的事件。此快速入门中有此技术的示例:http: //msdn.microsoft.com/en-us/library/dd458918.aspx

同样,这是我在理解您要完成的目标方面所做的最大努力。如果不是,请告诉我们。

于 2009-07-28T18:05:39.067 回答