【问题标题】:Interface options between WCF/REST web service, Entity Framework, and a WebForms front end: what are my options?WCF/REST Web 服务、实体框架和 WebForms 前端之间的接口选项:我有哪些选择?
【发布时间】:2012-02-29 19:58:21
【问题描述】:

我刚刚完成了一个使用 WCF/REST Web 服务的小项目,该服务使用实体框架访问数据库、应用一些次要业务逻辑,并将结果传递给 .NET Webforms 前端。这工作得很好,但最初的设计是在没有太多时间研究选项的情况下拼凑在一起的,现在我被要求做另一个非常相似的项目。我现在有更多的时间来看看那里有什么,并有可能比第一个做得更好。

我想知道是否有更好的方法来完成这几件事,特别是围绕在 Web 服务和前端之间来回传递对象。

对于第一个项目,我创建了一个共享库,其中包含 Web 服务和网站都使用的类定义。当请求进入 Web 服务时,将执行 DB 查询,应用业务逻辑,并创建共享类型之一的对象并在 Web 服务响应中传回。

网站收到响应后,将其反序列化为适当的共享对象,然后继续其愉快的方式。

它工作得很好,但是必须编写大量代码来定义共享对象,然后将查询结果/业务逻辑结果映射到共享对象。

有没有更好的方法?具体来说,我正在寻找一种方法:

  • 自动生成对象。 (我不确定是否存在 - 似乎我可以自动生成专门映射到数据库实体(如表或视图)的对象(实际上,这就是实体框架所做的)但是需要包含非数据库信息的对象呢?像业务逻辑可能添加的东西?)

  • 删除对 Web 服务和网站之间共享库的要求。我怀疑这可能存在,但我什至不确定从哪里开始。

【问题讨论】:

    标签: .net wcf entity-framework rest


    【解决方案1】:

    我正在做一个类似的项目,这就是我正在做的事情(你可以决定它是否适合你)。

    • 视图使用 UIModel
    • 调用函数时,我将 UIModel 传递给 ServiceManager,该 ServiceManager 将 UIModel 映射到 ServiceModel
    • ServiceManager 将 ServiceModel 发送到服务(我正在使用 RestSharp 来减少映射代码)
    • 我的服务接收到 ServiceModel 并立即将其映射到 BusinessModel(我再次使用 ServiceStack 来减少映射代码)
      • 服务的唯一工作是解开服务对象并适当地路由它。这隐藏了我的实际业务层的内部细节。如果这对您不重要,那么您的 BusinessModel 可以与您的 ServiceModel 相同(并且可能与您的数据库模型相同)
    • 我的服务将业务模型发送到 BusinessManager,它会执行任何业务逻辑,然后创建一个 PersistenceModel 以传递给 RepositoryManager 以进行持久化
    • 然后整个过程反过来

    所以,我最终得到了 4 个模型,总结如下:

    • UI 有自己的模型
    • ServiceManager 和 Service 共享一个模型(这也是 ServiceManager 的重点;将 UI 的关注点与服务分开)
    • 业务逻辑有自己的模型
    • 持久化逻辑有自己的模型

    正如上面已经提到的,这允许关注点分离。我可以潜在地更改我的持久性模型,而无需更改我在服务中设置的合同(这将是公开的)。这将使内部更改不会破坏外部应用程序。不过,您确实冒着必须更改所有模型的风险。

    至于将它们全部映射在一起的样板,我使用的是 AutoMapper。因此,由于 AutoMapper、RestSharp 和 ServiceStack,代码不会因为映射而杂乱无章。代码看起来像代码:)

    我不确定这是否完全回答了您的问题,但听起来确实有点像您在解释的内容。

    更新:

    这是为了尝试采用上述方法,使其更加具体到 BDW 的 ASP.NET 解决方案:

    • 创建一个仅存储您的 UIModel 的单独项目。
    • 在您的 asp.net 项目中引用它,并期望将其用于任何 asp.net 逻辑
    • 创建一个仅存储您的 ServiceModel 的单独项目。
    • 每当您需要调用服务时,将数据从您的 UIModel 转换为您的 ServiceModel
      • 这可以在您的 asp.net 项目中完成。或者,您可以创建一个新项目,该项目将采用 UI 模型并为您进行转换和服务调用(这样您的服务模型就不必在 asp.net 部分中引用)
    • 使用 ServiceModel 创建另一个将为您调用服务的项目
    • 现在,您可以为您服务,根据您的评论,您可以处理剩下的事情

    【讨论】:

    • 听起来你在使用 MVC?不确定这是否映射到我正在做的事情 - 对于这个项目,我正在使用 .NET WebForms,目前无法更改。
    • 实际上应该没关系。唯一的区别是注入依赖项(管理器)会更加困难。否则,我的想法只是基于 UI、服务、业务和持久性的概念。是的,MVC 和关注点分离使这更干净,但同样没有必要。将模型传递给 servicemanager 后,一切都一样。
    • 好奇你为什么使用 RestSharp 而不是 ServiceStack 的内置 ServiceClients?否则你会节省更多样板文件吗?
    • 更不用说在客户端免费获得输入错误处理:github.com/ServiceStack/ServiceStack/wiki/Validation
    • 你能给我指一些网上的例子吗?我对你所说的模型概念完全不熟悉。我真的只关心 UI 和 Web 服务之间的层。更改持久性模型并将业务逻辑分离为自己的层不是此项目的要求。
    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2019-10-02
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多