【问题标题】:Modular MVVM application using WPF and PRISM [closed]使用 WPF 和 PRISM 的模块化 MVVM 应用程序
【发布时间】:2018-10-01 00:38:33
【问题描述】:

让我们简化我的应用程序:
我有两个棱镜模块:用于可视化一些数据的 shell 模块和第二个模块 - WCF 服务,它正在获取该数据(假设数据是某个寄存器的名称和值)。我的计划是将其设置为共享服务,并将其作为依赖项注入我的一个 shell 模块类。我的问题是,我不知道该服务引用应该在哪个类中:在模型中或在视图模型中(例如主窗口)。 我可以设置一个寄存器模型,它会自行获取其名称和值(使用对 WCF 服务的存储引用)。 但我不确定这是实现这一点的正确方法。我的代码:

//Bootstrapper.cs  ->register WCF service in a container
RegisterTypeIfMissing(typeof(IDatabaseService ), typeof(DatabaseService), true);

这可能是我在 ViewModel 中引用的模型:

public class Register
{
    IDatabaseService service;  //reference to WCF service (which is in separate module)
    public int RegisterValue { get; set; }
    public string  RegisterName { get; set; }   
    public Register(IDatabaseService _service) //this will be resolved in a container
    {
        service = _service;      
    }
}

【问题讨论】:

  • 这都是非常主观的,对于软件工程堆栈交换站点来说可能更好。但是,如果您的意思是数据模型中的模型,请不要将其远离那里。根据您的架构和程序的大小,将其注入您的 VM 或者如果您有某种业务层可能更适合那里。但是,说了这么多,这都是主观的,我根本不知道您的要求和现有架构

标签: c# wpf prism


【解决方案1】:

您需要注意您对“模型”的定义I explain this here。您的服务是“模型”的一部分。

您几乎走在了正确的轨道上,但您不应该将诸如服务之类的东西注入数据实体中。如果您的应用程序较小,请随时从您的视图模型中使用该服务。如果您的应用程序较大并且您需要某些业务逻辑,那么一种选择是在您的视图模型后面有另一个使用该服务的类,该类将是 n 层架构中的业务层。

因此,为了用文字说明这一点,您将拥有 view->viewmodel->business class->service。

【讨论】:

  • 我同意。将 IDatabaseService(它是模型的一部分)注入到您的视图模型中。
  • 好的,谢谢。只剩下一件事:如果多个视图模型需要访问 DatabaseService 获取的数据怎么办?
  • @KarolŻurowski 他们应该都注入了服务,您可以将 Prism 配置为只保留一个实例(尽管在大多数情况下我建议不要这样做)。如果数据的获取成本很高(即它很大或需要很长时间),那么您可以考虑使用缓存模式 - 服务首先进入缓存以获取数据,如果不存在,则进入数据源获取它.
【解决方案2】:

我在以下解耦一个更简单的应用程序的场景中取得了巨大的成功,但我认为这对您的目的很有效。

WFCApp
-WCFApp.Models      <- Data Model
-WCFApp.DataAccess  <- Data Access Layer
-WCFApp.Service     <- Expose Service as IDatabaseService

PrismApp
-PrismApp.Models
-PrismApp.ViewModels
-PrismApp.Views
-PrismApp.DataProvider  <-This is the only thing that knows about IDatabaseService.

因此,您现在可以注入IDataProvider,而不是将IDatabaseService 注入您的ViewModel。

这解决了以下问题,可能适用也可能不适用:

  1. 允许您为 ViewModel 编写单元测试(如果您要注入 IDatabaseService,它必须是集成测试!)
  2. 进一步将您的 UI 应用程序与 WCF 服务分离,这当然使 UI 或 WCF 服务更容易独立更改。
  3. 这是一个延伸,但却是一个很好的例子:假设您的 IDatabaseService 公开了 Read()Update() 函数,但您希望 UI 只读。使用您的 IDataProvider,您可以隐藏那些公开的方法。

这是我的应用中的一个示例;

public class DataProvider : IDataProvider
{
    private readonly IDataService _service;

    public DataProvider(IDataService _service)
    {
        _service = service;
    }

    public List<Appointments> GetAllAppointments()
    {
        return _service.GetAllAppointments();
    }
}

public interface IDataProvider
{
    List<Appointments> GetAllAppointments();
}

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 2012-01-17
    • 2012-02-11
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2012-07-17
    相关资源
    最近更新 更多