让我们简化我的申请:
我有两个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;
}
}
答案 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。
这解决了以下问题,可能适用也可能不适用:
IDatabaseService
公开Read()
和Update()
个功能,但您希望用户界面只读。使用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();
}