.net 是否在业务对象中封装数据库连接?

.net 是否在业务对象中封装数据库连接?,.net,database,.net,Database,我通常喜欢自己创建数据库连接,并使用“using{}”手动控制其生存期。例如: SqlConnection sqlConnection = new SqlConnection( connectionString ); using( sqlConnection ) { BusinessObject myBusinessObject = new BusinessObject( sqlConnection ); // do stuff with the business object

我通常喜欢自己创建数据库连接,并使用“using{}”手动控制其生存期。例如:

SqlConnection sqlConnection = new SqlConnection( connectionString );
using( sqlConnection ) {
    BusinessObject myBusinessObject = new BusinessObject( sqlConnection );
    // do stuff with the business object
    ...
}
通过这种方式,我可以清楚地看到,我正在使用一种需要适当清理的资源。然而,这确实是一个重复性的工作。我试图在业务对象内部创建Sql连接,并在其上实现IDisposable。我将关闭Dispose()方法中的连接

我遇到的问题是,除非您看到业务对象正在使用,否则可能不太明显需要处理它


你们会怎么做呢?

首先,我要保留到存储库的连接

其次,我不会让一个连接挂在一个对象上——我只会将它用于一个工作单元(即一个方法)。很有可能(由于池化),您将恢复相同的物理连接。系统在处理这些事情方面已经走了很长的路,这样你就不必这么做了


更棘手的情况是事务,其中
TransactionScope
比传递db事务对象容易得多。

业务对象对于数据库应该是合理(或完全)哑的。您应该实现某种访问层对象(存储库或数据上下文),它知道如何将业务对象持久化到数据库,并将连接逻辑保留在数据库中,而不是将代码放在每个业务对象中。您的存储库或上下文将是一次性的,这样它就可以自己清理@Marc建议您遵循工作单元模式,这是一个很好的建议


如果您坚持编写自己的数据层,您可能需要查看LINQtoSQL、nHibernate、Subsonic等来使用它们,或者至少了解如何构造一个好的数据层。根据个人经验,我可以告诉你,使用现有技术要比编写和维护自己的技术容易得多。

我认为业务对象不应该知道或关心它是否持久。单个持久性业务对象无法知道它何时是更大工作单元的一部分;这是服务层的责任。将连接排除在业务对象之外。服务层是获取连接(通常来自连接池)、设置事务边界、提交或回滚以及清理的正确位置。

我同意保留连接。我将保持业务对象的生存期与使用手动创建的连接时相同。问题是其他使用API的人可能不会。可能创建/关闭与BO的通话连接?但也许我们会想要一个变性人。后来,@Marc——我在TransactionScope方面的经验还不太丰富,不过使用LINQToSQL可能会更好。不管怎样,当使用TableAdapters时,我发现几乎所有的事务都会升级为分布式事务,并且通过防火墙将其工作到DB,这是一个无止境的问题。谢谢你的回答。我在这里考虑的代码非常简单。我过去用过NHibernate,不确定我是否想去那里做这个项目。但是正如你所说的,也许通过源代码的旋转是一个很好的练习。如果NHiBiNT看起来太多,那么考虑LIQOQTQL。根据我的经验,它非常轻。您可以将L2S实体视为DTOS,或者将部分类/方法扩展到完全成熟的业务对象中。
using( BusinessObject myBusinessObject = new BusinessObject() ) {
    // do stuff with myBusinessObject
    ...
}