2012-10-02 136 views
0

我只需要一些帮助来组织我的代码。这不是哲学,而是真正的问题。我正在寻找一个可行的解决方案。例如在php和symfony框架中,如何组织代码非常清晰。在c#.net我感觉失落。
我只是想从头开始重写我的项目重用一些部分。具有Web服务的.net应用程序的体系结构

说明
首先是因为我针对许多平台上的Windows Mobile,Windows桌面,Android,网络似乎我应该公开的功能的Web服务,而不是与数据库直接通信。它是否正确 ?
然后,我需要一些客户端应用程序。一个wpf,android和windows mobile。

在wpf我想我可以使用MVVM模式。

问题
我使用PostgreSQL使用ADO.NET和相比其他同类应用中的性能是惊人的。我发现Dapper会帮助很多,并且是我一直在寻找的东西。不过,我无法把sql代码放在哪里。好吧,我有模型类..就像客户,奥德等...然后,我应该把sql代码放在哪里?我应该把CRUD代码放在单独的类上吗?目前我在控制器类中有一些代码,但是当我想要某个东西时,我总是构造一个新的控制器类。这看起来不太好。
是否有任何模式如何组织数据库代码?

+1

如何组织数据库代码有*许多*模式。一般的做法是以一种对消费该功能的代码有意义的方式封装功能。除此之外,尽管如此,你的问题可能太过于开放,无法获得简洁的答案。 –

+0

看看[Sharp Architecture](https:// github。com/sharparchitecture/Sharp-Architecture/tree/master/NugetTemplates)了解如何管理ORM的一些指示。 – Nick

回答

1

您的后端部分需要提供以下functionallity:

  1. 操作与客户:从客户端进程请求并发送响应回客户端。这里的主要问题是定义请求/响应格式。例如,您可以使用SOAP或REST,.NET框架服务框架(如WCF)可以与这两种协议协同工作,但对我而言,它更加面向SOAP。 WCF使用类来描述服务契约,所以我认为最好使用一些实体而不是纯ADO.NET。

  2. 通知客户端有关错误:包括验证错误和异常。验证消息需要在客户端上显示,通常通过属性名称来处理,异常也应该被处理。还有处理与数据库相关的错误并将其转换为域模型错误的问题。

  3. 基于services的WCF体系结构 - 它是通过一组协议访问的契约及其实现。由于WCF使用实体序列化和反序列化,所以将任何业务逻辑放入实体并不是一个好主意。把它放到单独的类(repositories)并从您的服务调用存储库。它被称为anemic domain model - 域实体不包含任何业务逻辑 - 与rich domain model相反 - 实体包含业务逻辑。

  4. 对数据库的访问通常被封装为一组称为数据访问层(或DAL)的类。 DAL提供了一组持久化实体到数据库或从数据库加载实体所需的方法。此方法不应包含业务逻辑,但会封装来自业务逻辑层的数据库详细信息和结构。要实现常用的图层帮助器工具:像ORM(实体框架,BLToolkit等)。

  5. 业务逻辑层(BLL) - 使用来自DAL的方法来存留实体。它不应该直接与数据库一起工作 - 只需调用DAL中的方法即可。业务逻辑包含实体和实体集所有操作 - 包括验证,计算,权限检查等

编辑

支持您可以使用从数据库类脱钩像TransactionScope或事务支持交易内置于ORM。

业务逻辑相对不依赖于DAL操作总是好的 - 即业务层流程实体不知道实体将被保存。如果可能的话,你可以在DAL中封装数据库事务 - 但是这可能必须让你有很多参数的丑陋的方法,并通过许多实体和集合来保存内部事务。

但通常这是不可能的,业务逻辑层方法几次调用DAL操作 - 加载和保存其他实体。在这种情况下,交易范围或它的ORM类似物是一个不错的选择。

+0

好吧,例如我想要下一个新的订单。 Web服务placeOrder被调用。那么应该调用什么? BLL或存储库?一些业务逻辑,如数据库事务应该放在哪里?我的意思是一些并发和验证检查应该在一个事务处理中完成,并且这只能在DAL中完成,但是你说那里没有业务逻辑.. – GorillaApe

+0

它应该调用业务逻辑。业务逻辑必须验证订单,支票金额,计算税金等,并使用DAL将其保存到数据库。 我编辑了我的答案,因为评论无法格式化得很好 – STO

1

您可能想要考虑使用业务逻辑层,数据访问层和用户界面的N层应用程序。更多细节:http://en.wikipedia.org/wiki/Multitier_architecture

我会这样做,并通过DAL(数据访问层)访问我所有的存储过程或SQL代码(或LINQ-To/EF)。

但是,如果您使用的是Web服务(我想您只有UI和BL层),这可能不是必需的 - 只需调用Web服务并执行您需要的结果。

所以,你的应用程序将只是UI和BL。 BL调用Web服务(以相同的方式调用DAL,如果有的话),检索数据并执行它需要做的事情。

只有在BL处理请求/响应并传递给DAL以将数据传回应用程序时,您的webservice才会成为BL和DAL。

1

我应该在哪里把SQL代码,我应该把CRUD代码在 单独的类?

是的,看看Repository pattern - 你的数据代码应该是分开的,并返回对象,如CustomerEntity FrameworkNHibernate可以提供合适的功能并且是行业标准。

你也可以把一个Service Layer放在那个,它从你的多个前端被调用。

请确保您在图层之间使用了DI以减少紧密耦合,现在我喜欢StructureMap,但有许多好的框架。

顺便说一下,您还可以在MVC中使用MVVM模式。

+0

开箱即用.net支持依赖注入? – GorillaApe

+0

您可以使用Ninject,StructureMap或Microsoft的Unity等DI框架。 .NET本身没有一个部分。 –

相关问题