0

我只需要一点帮助来组织我的代码。这不是哲学,而是真正的问题。我正在寻找一个可行的解决方案。例如在 php 和 symfony 框架中,如何组织代码非常清楚。在 c# .net 中,我感到迷茫。
我只想重新使用某些部分从头开始重写我的项目。

描述
首先,因为我的目标是许多平台 windows mobile 、 windows desktop 、 android 、 web ,所以我似乎应该将功能公开为 Web 服务,而不是直接与数据库通信。这个对吗 ?
然后我需要一些客户端应用程序。一个wpf,android和windows mobile。

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

问题
我将 postgresql 与 ADO.NET 一起使用,与其他类似应用程序相比,其性能令人惊叹。我发现Dapper会有很大帮助,并且是我一直在寻找的东西。但是我在哪里放置sql代码时遇到了麻烦。好的,我有模型类.. 像 Customer ,Oder 等......那么我应该把 sql 代码放在哪里?我应该将 CRUD 代码放在单独的类中吗?目前我在控制器类中有一些代码,但是当我想要一些东西时,我一直在构造一个新的控制器类。这似乎并不好。
是否有任何模式如何组织数据库代码?

4

3 回答 3

1

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

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

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

  3. WCF 架构基于services- 它是契约,它的实现由一组协议访问。由于 WCF 使用实体序列化和反序列化,因此将任何业务逻辑放入实体并不是一个好主意。将其放在单独的类 ( repositories) 中并从您的服务中调用存储库。所谓anemic domain model- 领域实体不包含任何业务逻辑 - 相反rich domain model- 实体包含业务逻辑。

  4. 对数据库的访问通常被封装到一组称为数据访问层(或 DAL)的类中。DAL 提供了一组将实体持久化到数据库或从数据库加载实体所需的方法。该方法不应该包含业务逻辑,而是从业务逻辑层封装数据库细节和结构。实现该层常用的辅助工具:如 ORM(实体框架、BLToolkit 等)。

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

编辑

为了支持事务,您可以使用与数据库类(如TransactionScope)或 ORM 内置的事务支持分离。

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

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

于 2012-10-02T13:22:06.867 回答
1

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

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

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

因此,您的应用程序将仅是 UI 和 BL。BL 调用 web 服务(如果你有一个,它会调用 DAL),检索数据并做它需要做的事情。

然后,您的 Web 服务将成为 BL 和 DAL,仅在 BL 处理请求/响应并与 DAL 通信以将数据传递回应用程序的情况下。

于 2012-10-02T13:06:37.147 回答
1

我应该把sql代码放在哪里,我应该把CRUD代码放在一个单独的类中吗?

是的,看看Repository 模式——你的数据代码应该是独立的并返回对象,例如Customer. Entity FrameworkNHibernate可以提供合适的功能并且是行业标准。

您还可以在其上放置一个服务层,从您的多个前端调用它。

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

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

于 2012-10-02T13:13:20.000 回答