Ric*_*end 7 .net wpf prism wcf-data-services
我们将很快开发一个大型企业桌面应用程序,我花了一些时间研究WPF + PRISM + MVVM方法,我已经很好地掌握了大多数概念,并且非常喜欢它提供的模块化.
我遇到问题的方法是如何构建服务层以获取数据,特别是当模块引入该服务时,依赖模块可以使用它.
我想在应用程序服务中抽象我的WCF数据服务,并用于ServiceLocator从我的视图模型中解析具体实例,但是我很难弄清楚它应该如何挂起,主要是因为我的entites是WCF服务的一部分.
例如
Module1 包含WCF服务+具体应用程序服务(ISearchService)+ WCF服务生成的实体(模型)
Module1.Infastructure - 包含应用程序服务的以下接口
public interface ISearchService
{
ObservableCollection<Person> Search(string search);
}
Run Code Online (Sandbox Code Playgroud)
这将在UnityContainer中注册,以便任何其他模块可以获得模块内嵌的具体实现.
我的问题是Entities(Person)是在模块本身(在WCF服务中)中定义的,因此引入服务然后期望任何其他模块能够使用它意味着他们需要引用模块本身而不仅仅是模块infastructure除非我将服务撤出到另一个程序集中.
我应该以这种方式暴露我的EF模型自动生成的entites吗?
有没有人有更好的解决方案?
这是如何做到的。
我目前正在使用 Silverlight + PRISM + MVVM + WCF (RIA) 服务。
以目前的项目架构
Application.RIAServices :这是包含从 WCF RIA 服务 Web 项目自动生成的类的项目。我可以在 WPF 和 Silverlight 中引用这个项目。
Application.RIAServices.Web :包含 DomainServices 和使用 DbContext 的数据库生成代码的 Web 项目。这是 Application.RIAServices 的 WCF RIA 链接项目
应用程序.基础设施:这是它开始的地方。因为就像您一样,我有一个使用接口 ICustomerService 的人员/客户服务。因为我想在应用程序范围内使用此服务,而不仅仅是在 ModuleA 中,所以我将此接口放置在基础设施中。所有项目都包含对此项目的引用。
Application.Modules.ModuleA --> Application.Modules.ModuleD :提供功能的通用模块。我的所有模块(使用 WCF RIA 服务)都引用了 Application.Infrastruct 和 Application.RIAServices 项目。
Application.Shell:启动项目。拥有引导程序并注册所有相关模块。
阅读雷切尔的问题让我思考了某些事情,我只想留下关于我是如何做到的的结构。你可能对此有一个想法。我还不想使用 DTO,因为验证之类的东西在 WCF RIA 服务中集成得非常好,当出现问题并显示错误消息时,它会自动反映在文本框中。期待听到您的意见和问题/问题的结果
编辑:
Application.Domain 也有一个单独的结构。
我有我的模特。仅容器需要映射到数据库的纯属性。然后我有我的元数据文件夹。现在,为了使其正常工作,我需要与我的实体具有相同的命名空间,并且我将实体部分化。我创建一个 Entity.metadata.cs 文件,并在其中创建一个internal sealed class EntityMetaData,复制属性并向其中添加属性。通过使用MetadataType实体类上方的属性,它将所有这些属性添加到 EF/WCF RIA 代码生成器。
这些属性之一是CustomValidation它使用静态类和方法参数并验证服务器上的实体。或者,如果您创建带有 .shared.cs 扩展名的文件,它将生成到 Application.RIAServices 项目。
可能性
要尝试回答您的问题,您可能只有一个选择,这就是您最初建议的。您可以创建一个客户.基础设施项目。
该项目包含 ICustomerService 的接口、您想要的实体/DTO/POCO,甚至可能包含此 ICustomerService 或 WCF 服务的实现。然后,这允许您的所有模块引用该项目,从而不会在模块之间创建依赖关系。