使用WPF和PRISM的模块化MVVM应用程序

时间:2018-04-20 10:09:26

标签: c# wpf prism

让我们简化我的申请:
我有两个prism模块:shell模块可视化一些数据和第二个模块 - WCF服务,它获取数据(让我们说数据是某个寄存器的名称和值)。我的计划是将其设置为共享服务,并将其作为依赖项注入我的一个shell模块类。我的问题是,我不知道,这个服务引用应该在哪个类中:在模型中或在viewmodel中(例如mainwindow)。 我可以设置一个寄存器的模型,它将自己获取它的名称和值(使用存储的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;      
    }
}

2 个答案:

答案 0 :(得分:2)

您需要注意"模型",I explain this here的定义。您的服务是"模型"。

的一部分

您几乎走在正确的轨道上,但您不应该将类似服务的东西注入数据实体。如果您的应用程序较小,请随意使用您的viewmodel中的服务。如果您的应用程序更大并且您需要某些业务逻辑,那么一个选项是在您的viewmodel后面使用该服务的另一个类,该类将是n层架构中的业务层。

因此,为了以文字方式说明,您将拥有view-> viewmodel-> business class-> service。

答案 1 :(得分:1)

我在下面解决一个更简单的应用程序的方案中取得了很大的成功,但在我看来,这对你的目的来说很有用。

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.

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

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

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

    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();
    }