Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将WPF桌面应用程序转换为客户机-服务器技术的良好体系结构_C#_Sql Server_Wpf_Design Patterns_N Tier Architecture - Fatal编程技术网

C# 将WPF桌面应用程序转换为客户机-服务器技术的良好体系结构

C# 将WPF桌面应用程序转换为客户机-服务器技术的良好体系结构,c#,sql-server,wpf,design-patterns,n-tier-architecture,C#,Sql Server,Wpf,Design Patterns,N Tier Architecture,我有一个WPF应用程序,可以在一台PC上运行。我使用SQL server数据库、实体框架与数据库进行通信 以及应用程序中的RDLC报告。现在,要求该应用程序在本地公司网络上工作,在本地公司网络中,多个用户(通常最多25个)将根据设置的角色和权限访问该应用程序。我在这方面做了一些研究和开发,主要使用了这里提到的体系结构,在这样做之后,我做了一个应用程序的论文设计/体系结构,看起来像这样 在公司网络内的高端服务器上运行的WCF服务 服务本身-定义连接到服务的协议 以及所有其他必要的信息 算法-将是主

我有一个WPF应用程序,可以在一台PC上运行。我使用SQL server数据库、实体框架与数据库进行通信 以及应用程序中的RDLC报告。现在,要求该应用程序在本地公司网络上工作,在本地公司网络中,多个用户(通常最多25个)将根据设置的角色和权限访问该应用程序。我在这方面做了一些研究和开发,主要使用了这里提到的体系结构,在这样做之后,我做了一个应用程序的论文设计/体系结构,看起来像这样

在公司网络内的高端服务器上运行的WCF服务

  • 服务本身-定义连接到服务的协议 以及所有其他必要的信息
  • 算法-将是主要的业务逻辑层,将 包含逻辑并将作为客户端调用的接口 数据库层方法
  • persistence-将有实际的数据库交互方法,如 获取/存储/更新/删除数据库中的记录
  • Data-这将包含实体的edmx模式 框架工程
  • Entites-它将包含数据库模式的实体 和附加的部分类
  • **

    客户:

    客户机现在将使用基于MVVM模式的WPF应用程序(将来可能需要使用Web应用程序,但现在不需要)。该应用程序的主要组件包括:

  • 从excel导入:当前所有数据都在excel文件中。诸如此类 数据需要导入到系统中
  • 编辑/更新/删除:导入数据后,允许用户使用界面 编辑/更新/删除记录的步骤
  • 生成报告(为此使用RDLC)
  • 用户/角色管理等
  • 共享: 这是一个库,其中包含不同的杂项类,如读取excel文件的代码、处理错误的代码、将绑定到UI的集合等

    DB context:将在持久性层内的using语句中为每个方法创建,以确保不留下过时的信息。

    该架构是否遵循n层架构,是否灵活?这方面需要哪些改进,请指导我如何改进存在的任何问题。在我继续更改现有应用程序之前,我想确保这是一个良好的体系结构。

    这非常有意义。(尝试构建TDD风格的it)


    <> P>为了让您的生活更轻松一些,客户端版本管理考虑使用ClikOnter安装程序来执行您的用户计算机上的最新版本安装(一旦您将其移动为Web应用程序,这种头痛就会消失).

    看起来你走的是正确的道路,但是你可能在某些领域过度工程化了

    我认为EntityFramework在很大程度上为您处理实体、数据和持久性层。除非您希望最终用其他ORM系统取代EntityFramework,否则自己实现它们可能会有些过分

    在这里,您可以使用GPC.Services库避开SOA(面向服务的体系结构)。在这里,您需要了解如何将服务层分解为一个或多个atmoic服务,以服务于客户端应用程序。有很多方法可以实现这一点,这在很大程度上取决于您计划如何使用服务层。看看RESTful服务,它很好地分解了服务层,并将引导您构建整洁的atmoic服务。为此,请查看Asp.net Web API

    我认为你在GPC.Alogrithms库中寻找的是一个真正的领域模型。域模型封装了所有业务逻辑,并允许您通过公开的公共函数对对象执行状态更改。考虑到这一点,系统的各层将如下所示:

    持久性(EF)->域模型->服务层->DTO(数据传输对象)->客户端

    上面提到的DTO对象是一组POCO(普通的旧C#对象),负责向客户机传递数据和从客户机传递数据。您需要这样做,因为由于反向引用和其他封装问题,序列化和淡化域对象将成为问题。将DTO放在适当的位置将强制执行上下文边界,这曾经是SOA的原则之一——“边界是明确的”,请参阅

    关于客户端,您似乎已经步入正轨。您可能想做的是重构当前的客户机应用程序,以便将所有数据查询合并到一个层中。因此,当时机成熟时,您只需将该层替换为服务实现