在 winforms 和 web 应用程序之间共享数据层和模型层的最佳方法

Posted

技术标签:

【中文标题】在 winforms 和 web 应用程序之间共享数据层和模型层的最佳方法【英文标题】:Best approach for sharing data layer and model layer between winforms and web app 【发布时间】:2012-08-29 02:51:02 【问题描述】:

我目前正在为一家公司开发 ERP 解决方案。要求如下:

    他们需要一个基于 winforms 的应用程序来处理 HR、BSC、库存等模块。

    一个基于网络的解决方案,需要所有员工访问他们的个人数据、申请休假等。这需要是一个基于互联网的解决方案,可以从任何地方访问。

    未来他们还想要一个基于 Web 的文档管理系统。

现在我们已经完成了 winforms 应用程序中的一些模块,因为这是迫切的需求。对于winforms,我们采用了分层架构的水平方法。即每个模块都是一个项目,在项目中有自己的数据层和业务层。现在我需要开始研究网络解决方案。我只是想知道哪种方法是在 winforms 应用程序和 Web 应用程序之间共享数据层和模型层的最佳方法。此外,Web 应用程序需要具备适当的安全性,因为它将是敏感数据。我考虑了 2 种可能无法涵盖所有​​可用可能性的方法。

我能想到的方法如下:

一个。创建一个 Web 服务来处理数据层和模型。将其托管在服务器上并通过 winforms 应用程序和 Web 应用程序访问它。为此,我需要更改我已经完成的编码。但这是可以接受的,因为它作为一个层架构需要最少的努力。这里我唯一的疑问是,对于 winforms 应用程序,它会不必要地通过 Web 服务层并使其变慢。

b.将数据层和模型转换为 dll。在 winforms 和 web 应用程序中访问这些 dll。

关于网络应用程序,这将是更好的方法:

一个。我应该选择基于 MVC3 的网络应用吗?

b.还是 asp.net 和 WCF?

情况是我和一位同事一起从事这个项目,我们只有 2 人的团队。所以我们是对所有事情做出决定的人。

我在 winforms 方面有相当好的经验,但在基于 Web 的技术方面的经验相对较少。非常感谢您对此的意见。

【问题讨论】:

【参考方案1】:

如果您希望您的模型类型与您的数据库架构紧密对应,您可以使用实体框架设计器和自我跟踪实体模板来创建它们。这将允许它们通过 WCF 轻松地通过更改进行序列化,并在数据库中持久化。然后,您可以选择创建自定义 WCF 服务来处理实体,也可以使用 WCF 数据服务 (OData) 将实体框架上下文直接公开为服务。

就表示层而言,您列出的两个选项并不相互排斥。您可以使用带 WCF 的 MVC、不带 WCF 的 MVC、带 WCF 的 WebForms、不带 WCF 的 WebForms……因为无论如何您都需要创建服务,而 MVC 似乎是这些天要走的路,我可能会推荐一个 MVC使用 WCF 服务访问数据的应用程序。

【讨论】:

感谢您的意见。过去我对 Entity Framework 没有很好的体验。它非常缓慢,数据检索需要很长时间......正如我提到的,我们已经为 winforms 应用程序准备了 3 个模块。所以我更喜欢修改现有的代码而不是编写全新的结构。大多数情况下我会使用带有 WCF 的 MVC 但是在 winform 的情况下,如果它通过 WCF 服务访问数据会不会变慢? 我认为这样做是一种非常标准的设置...但是如果您担心 WCF 的性能,您可以让您的本地数据访问组件和 WCF 服务实现相同的接口。这样,WCF 服务就可以直接传递到本地组件,而 ASP.NET 应用程序可以直接使用它。另一种选择是使用 netNamedPipe 绑定与 WCF 服务通信,这对于同一台机器上的客户端和服务来说往往更快。 Entity Framework 自初始版本以来已进行了一些重大的性能和可用性改进,但我理解您的担忧。如果您仍想使用 ORM,这里有一个很好的选择资源:ormeter.net 感谢luksan的解释。

以上是关于在 winforms 和 web 应用程序之间共享数据层和模型层的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在类似 Web 应用程序之间共享 Web 层代码(控制器和 JSP)的最佳实践

在不同服务器上的 ReactJS 和 WIX Web 应用程序之间共享会话

在Web和控制台应用之间共享配置文件

使用 Spring Security 在 Web 应用程序和 RESTful 服务之间共享安全上下文

Tornado websockets:在进程之间共享打开的 web sockets

在 Elastic Beanstalk Web 和工作程序层之间共享数据