2012-02-29 32 views
1

我刚刚使用WCF/REST Web服务使用Entity Framework访问数据库,应用一些次要业务逻辑并将结果传递给.NET Webforms前端,从而得到了一个小项目。这很奏效,但最初的设计却没有很多时间来调查选项,现在我被要求做另一个非常类似的项目。现在我有更多的时间去看看那里有什么,并且可能比第一个项目做得更好。WCF/REST Web服务,实体框架和WebForms前端之间的接口选项:我的选项是什么?

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

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

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

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

有没有更好的方法?具体而言,我正在寻找的方法是:

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

  • 删除Web服务和网站之间共享库的需求。我怀疑这可能存在,但我甚至不知道从哪里开始。

回答

2

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

  • 查看使用UIModel
  • 当一个函数被调用时,我通过我的UIModel到了UIModel映射到ServiceModel
  • 的的ServiceManager发送ServiceModel到服务(我用RestSharp到的ServiceManager削减映射代码)
  • 我的服务接收ServiceModel并立即将其映射到一个商业模式(我用ServiceStack来,再次削减映射代码)
    • 服务的唯一工作就是拆礼物服务对象并适当的路线。这隐藏了我实际业务层的内部细节。如果不是对你很重要,那么你的商业模式可能是一样的,你ServiceModel(以及可能与您的数据库模型)
  • 我的服务发送的商业模式的BusinessManager,这是否有任何业务逻辑和然后创建一个PersistenceModel传递到被保留的
  • 然后,整个过程正好相反

所以,我结束了4个车型RepositoryManager总结如下:

  • UI有自己的模型
  • ServiceManager和Service共享一个模型(这也是ServiceManager的要点;以分离UI的从服务的关注)
  • 商业逻辑有其自己的模型
  • 持久性逻辑有其自己的模型

此,如已经如上所述,允许关注点分离。我可以改变我的持久性模型,而不需要改变我在服务中设置的合约(这将是公开的)。这样做会使内部更改不会中断外部应用程序。尽管如此,您仍然有可能需要更换所有型号。

至于将它们映射到一起的样板,我使用AutoMapper。因此,由于AutoMapper,RestSharp和ServiceStack的原因,代码不会混淆映射。该代码看起来像代码:)

我不确定这是否完全回答你的问题,但它听起来有点像你正在解释。

UPDATE:

这是试图走在上面,使之更加具体的BDW的ASP.NET解决方案:

  • 创建一个单独的项目,将只存储您UIModels。
  • 引用在您的asp.net项目中,并期望将其用于任何asp.net逻辑
  • 创建一个单独的项目,将只存储您的ServiceModels。
  • 每当你需要调用的服务,从您的UIModel将数据转换到你的ServiceModel
    • 这可以在asp.net项目内进行。或者,您可以创建一个新的项目,将采用UI模型并为您进行转换和服务调用(这样,您的服务模型不必在asp.net部分中引用)
  • 创建另一个项目将调用为您服务,使用ServiceModel
  • 现在,你在你的服务,并根据您的意见,您可以处理剩下的
+0

听起来你使用MVC?不确定映射到我正在做什么 - 对于这个项目,我使用的是.NET WebForms,这不是可以在这一点上改变的东西。 – BDW 2012-02-29 22:00:04

+0

实际上它应该没关系。唯一的区别是注入你的依赖关系(管理者)会更加困难。否则,我的想法只是基于用户界面,服务,业务和持久性的概念。是的,MVC和关注点的分离使得这个更清晰,但同样没有必要。一旦你将你的模型传递给servicemanager,它就完全一样。 – 2012-03-01 01:41:10

+1

好奇你为什么使用RestSharp而不是ServiceStack的内置ServiceClients?似乎你会节省更多的样板吗? – mythz 2012-03-01 08:13:29