我可以避免重复我的业务层吗?(.NET)

我可以避免重复我的业务层吗?(.NET),.net,wcf,asp.net-mvc-3,validation,client-server,.net,Wcf,Asp.net Mvc 3,Validation,Client Server,我有一个技术演示应用程序要编写,有多个客户端:web客户端(ASP MVC 3)、桌面客户端(目前它将是一个WCF应用程序,计划稍后添加到Metro)和一个移动客户端(Wp7是默认任务,但如果我觉得自己是一个时代百万富翁,我也可以尝试MonoDroid) 我在考虑为客户使用WCF。 我在考虑首先在后端使用EF模型。 然而,当我试图找出我的域逻辑(验证、计算属性等)应该放在哪里,而不必手动复制我在EF模型中已经声明的所有内容时,我的问题就出现了 我的第一个主要问题是EF内置了一个很好的对象跟踪功能

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

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

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

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

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

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

  • 如果我编写一个单独的BusinessLayer,它应该也使用EF实体,还是应该编写自定义业务对象?(基本上是重复一切)
  • 如果我使用EF实体,我必须对其进行部分验证,这很难看(在这一点上,我应该先切换到EF代码吗?)
  • 有没有一种好方法可以在客户端使用这些相同的验证

  • 我应该放弃这一切,尝试RIA服务吗


哦,这么多问题…

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

  • 采用了消息层或中间件(RabbitMQ用于异步消息传递,或webservices用于请求/响应)和序列化技术(Protobuffers或JSON),可跨所有三个边界工作。尽可能使用跨平台中间件。这就是我提到RabbitMQ/protobuffers/JSON的原因
  • 将所有业务逻辑移动到服务器-客户端根本无法访问数据库,必须通过中间件。客户端,包括桌面,实际上就像瘦浏览器一样访问所有操作的中间件服务
  • 创建共享程序集以保存客户端和服务器之间的消息、数据协定和公共类,所有客户端和服务器都可以引用这些类
最后一步(共享程序集)涉及创建一个完全兼容C#的项目(因此可以在WPF桌面或服务器上工作)和每个web客户端的附加项目(Silverlight,WP7)。要在多个客户端上双重部署代码,您需要在桌面程序集中有一个源代码副本,然后将相同的源文件“添加为链接”到Silverlight/WP7程序集。您必须有几个#if预处理器语句,但大体上可以使用此方法双重部署大块代码

您的堆栈变为

客户:

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

中间件:

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

信息/数据合同:

使用上述技术在所有客户机/服务器上共享

服务器:

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

我也会看一看,寻找灵感。这是可能的——我已经使用SL/WPF客户端和C#server编写了客户端/服务器应用程序,也使用上述方法编写了WPF客户端/Java服务器


最好的建议是,

我将使用普通的.net对象作为域,然后首先使用NHibernate或EF代码添加持久性。@CodeInChaos:这也是我的同事给我的建议:)我将研究中间件层的附加好处。我相信重新编译的数据对象和JSON序列化,以及EF代码首先,我想我会成功的。SWCF本质上是中间件。无论哪种方式,通过抽象web服务背后的功能,客户机保持精简,客户机技术可以更容易地重新设计“创建一个完全兼容C#的项目(因此可以在WPF桌面或服务器上工作)和每个web客户机的其他项目(Silverlight,WP7)”-您看到PortableLibrary的工作了吗?()@MattDavey,你好,不,我没有。谢谢分享链接。我在跨平台WPF/Sl方面做了很多工作,所以在这方面有任何帮助都是好的!!