C# 三层系统中数据库层的正确抽象?
我正在创建一个三层应用程序。基本上是这样的 客户端->(通过可选的服务器 成为瘦客户机)->业务逻辑-> 数据库层 基本上是这样做的,这样就不会有任何跳跃。因此,我希望所有SQL查询等都位于数据库层 嗯,现在我有点困惑了。我创建了几个静态类来启动数据库层,但是对于数据库连接我应该做什么呢?我应该在任何时候进入数据库层时创建一个新的数据库连接,还是这样做会浪费时间?每当您有一个ConnectionPool时,Connection.Open()会花费时间吗C# 三层系统中数据库层的正确抽象?,c#,.net,database,data-access-layer,C#,.net,Database,Data Access Layer,我正在创建一个三层应用程序。基本上是这样的 客户端->(通过可选的服务器 成为瘦客户机)->业务逻辑-> 数据库层 基本上是这样做的,这样就不会有任何跳跃。因此,我希望所有SQL查询等都位于数据库层 嗯,现在我有点困惑了。我创建了几个静态类来启动数据库层,但是对于数据库连接我应该做什么呢?我应该在任何时候进入数据库层时创建一个新的数据库连接,还是这样做会浪费时间?每当您有一个ConnectionPool时,Connection.Open()会花费时间吗 对我来说,业务层必须将IdbConnect
对我来说,业务层必须将IdbConnection对象传递到数据库层是错误的。似乎数据库层应该处理所有特定于DB的代码。你怎么认为?我如何在保持实用性的同时以正确的方式来做呢 仅在需要时打开连接。 不要维护与数据库的连接,这样会浪费很多。 当然你的数据库层会打开连接,我不知道为什么你认为BLL会将连接传递给数据库。BLL不知道数据库(至少它不应该知道),它应该处理业务规则等等。实际连接在db层打开 以下链接显示了BLL的外观: 连接字符串本身应该只是db layer类中的一个私有字符串变量,您应该能够从web.config文件中提取连接字符串信息。您可以创建一个类(或类的名称空间,取决于大小)来承载数据库层。在数据库类中,您应该只使用数据库层中的连接池。该池将在任何给定时间保持n个连接对数据库开放,因此您只需使用其中一个池连接运行查询,而不会产生大量开销 有了这个功能,您的数据库层应该提供业务层可以调用的公共方法的“API”。这些方法都不应该公开数据库连接对象——这些细节是数据层内部的 然后从业务层开始,每次需要运行查询时,只需调用数据库层的“API”
这有帮助吗?每次进入数据库层时都可以创建并打开一个新连接,并在完成连接后立即关闭连接。Net/Sql Server能够很好地处理连接池,这是可以接受的方法 您没有从业务层传入连接字符串也是正确的。它应该是数据层的私有(但可配置)成员。传统上,单独的“数据访问层”为检索和提交数据提供数据库上下文。为此,有几种众所周知的模式,例如存储库。ADO.NET还实现了其他一些功能,例如提供程序
实体框架和LINQ to SQL也是进一步封装和简化数据层隔离的良好选项。由于连接池,每次访问数据库时打开一个新连接通常不是问题 如果您可以重用打开的连接,而不必让连接长时间处于打开状态,也不必冒离开孤立打开的连接的风险,那么重用打开的连接并没有什么坏处。(实际上,我在访问db的所有类中都注入了一个datatool。这主要是出于单元测试的目的,但它也允许我有选择地保持连接打开,以供对db的多个调用使用。) 但同样,你不应该过分强调打开/关闭很多连接。更重要的是,您的DAL:
- 可维护、简单、灵活
- 表现尽可能好
- (最重要的)始终正确处理其连接