MVVM,Prism和服务发现

时间:2009-07-21 21:01:32

标签: c# wcf mvvm prism

我正在使用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 个答案:

答案 0 :(得分:0)

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

你能告诉我们为什么这不起作用吗?

答案 1 :(得分:0)

嗯......这里有很多信息,但我会抓住这个。

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

我认为你几乎拥有你需要的东西。我想你需要做的就是:

  1. 从您的WCF回调处理程序中,使用EventAggregator引发新客户信息以及客户ID 来引发事件。
  2. 从任何ViewModel的构造函数,订阅CustomerUpdated事件,为您在视图模型中查看的客户ID添加过滤器。您错过了这一点,但这很重要,否则您将得到一些与实例化的ViewModel无关的事件。此快速入门中提供了此技术的示例:http://msdn.microsoft.com/en-us/library/dd458918.aspx
  3. 同样,这是我努力理解你想要完成的事情。如果不是,请告诉我们。