WCF / REST Web服务,实体框架和WebForms前端之间的接口选项:我有哪些选择?

时间:2012-02-29 19:58:22

标签: .net wcf entity-framework rest

我刚刚使用WCF / REST Web服务启动了一个小项目,该服务使用Entity Framework访问数据库,应用一些次要业务逻辑,并将结果传递给.NET Webforms前端。这很好用,但最初的设计没有花很多时间来调查选项,现在我被要求做另一个非常类似的项目。我现在有更多的时间来看看那里有什么,并且可能比第一个更好地完成这个项目。

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

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

当网站得到回复时,它会将其反序列化为相应的共享对象并继续它的快乐方式。

它工作正常,但是必须编写许多代码来定义共享对象,然后将查询结果/业务逻辑结果映射到共享对象。

有更好的方法吗?特别是我正在寻找的方式:

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

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

1 个答案:

答案 0 :(得分:2)

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

  • View使用UIModel
  • 调用函数时,我将UIModel传递给将UIModel映射到ServiceModel的ServiceManager
  • ServiceManager将ServiceModel发送到服务(我使用RestSharp来减少映射代码)
  • 我的服务收到ServiceModel并立即将其映射到BusinessModel(我使用ServiceStack再次减少映射代码)
    • 服务的唯一工作是解包服务对象并适当地路由它。这隐藏了我实际业务层的内部细节。如果这对您不重要,那么您的BusinessModel可以与ServiceModel相同(并且可能与您的数据库模型相同)
  • 我的服务将业务模型发送到BusinessManager,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
  • 创建另一个将为您调用服务的项目
  • 现在,您正在服务中,根据您的评论,您可以处理其余的事情