我可以避免重复我的业务层吗? (。净)

时间:2012-01-03 10:44:42

标签: .net wcf asp.net-mvc-3 validation client-server

我有一个技术演示应用程序要编写,有多个客户端: Web客户端(ASP MVC 3),桌面客户端(目前它将是一个WCF应用程序,计划稍后将其调到Metro以及移动客户端(Wp7是默认任务,但如果我觉得自己是时间百万富翁,我也可以尝试使用MonoDroid)

我在考虑为客户使用WCF 我在考虑使用EF Model First作为后端 然而,当我试图弄清楚我在哪里放置我的域逻辑(验证,计算属性等)而不必手动复制我已在EF模型中声明的所有内容时,我的问题就出现了。

我的第一个主要问题是EF内置了一个很好的对象跟踪(obj.Components.Add(...); db.Save();),但是这个功能在客户端很容易找到。有没有办法绕过它而不必实现我自己的? (我知道怎么做,但这对于这个演示来说太多了)

我的第二个主要问题(正如标题所示)是域逻辑,主要是验证。

  • 我应该将业务对象重新编译到客户端并将wcf序列化为相同的对象吗?
  • 我应该尝试在客户端使用WCF生成的类吗? (回到第一个问题)
  • 我应该尝试使用共享程序集吗?

  • 如果我将我的逻辑写入MVC控制器,我的WCF服务将无法整齐地调用它们。

  • 如果我写一个单独的BusinessLayer应该也使用EF实体,还是应该编写自定义Business Objects? (基本上重复所有东西)
  • 如果我使用EF实体,我必须进行部分验证,这很难看(此时,我应该先切换到EF代码吗?)
  • 在客户端使用这些相同的验证有一个很好的方法吗?

  • 我应该废弃整件事并尝试RIA服务吗?

哦,这么多问题......

1 个答案:

答案 0 :(得分:3)

我之前在Windows上构建了跨平台应用程序(特别是WPF / Silverlight客户端,C#SQL Server后端),我所做的就是这个。

  • 使用消息传递层或中间件(RabbitMQ用于异步消息传递,或者用于请求/响应的Web服务)和序列化技术(Protobuffers或JSON),它们适用于所有三个边界。尽可能使用跨平台中间件。这就是我提到RabbitMQ / protobuffers / JSON的原因。
  • 将所有业务逻辑移至服务器 - 客户端根本无法访问数据库,必须通过中间件。包括桌面在内的客户端就像瘦浏览器一样,为所有操作访问中间件服务。
  • 创建共享程序集,以保存客户端和服务器之间的消息,数据交换和公共类,所有客户端和服务器都可以引用它们。

最后一步(共享程序集)涉及创建一个完全C#兼容的项目(因此适用于WPF桌面或服务器)以及每个Web客户端的其他项目(Silverlight,WP7)。要在多个客户端上双重部署代码,您在桌面组件中拥有一个源副本,然后将“添加为链接”相同的源文件复制到Silverlight / WP7程序集。您将不得不拥有一些#if预处理器语句,但总的来说,可以使用此方法双重部署大块代码。

您的筹码变为

  

客户:

所有客户端都有序列化,Web服务/中间件和MVVM / MVC模式的客户端实现

  

中间件:

服务器/ wpf桌面上的中间件实现可以是相同的。 Wp7和monodroid等需要不同

  

消息/ DataContracts:

使用上面概述的技术在所有客户端/服务器上共享

  

服务器:

所有业务逻辑,数据库访问和服务器端中间件实现。对于DB Access,我使用PetaPoco作为优秀的MicroORM。我相信microORM实现能够支持堆栈溢出,但我可能会错。

我还要看一下this article的灵感。有可能 - 我用SL / WPF客户端和C#服务器编写了客户端/服务器应用程序,也使用上述方法编写了WPF客户端/ Java服务器。

致以最诚挚的问候,