当更高层次的抽象依赖于更低层次的抽象(比如依赖于数据连接的业务逻辑类)时,通常通过构造函数提供更低层次的抽象。该技术被称为构造函数注入:
public class OrderService
{
private SqlConnection connection;
public OrderService(SqlConnection connection)
{
if (connection == null)
throw new ArgumentNullException("connection");
this.connection = connection;
}
// Other methods
}
这就允许你写对服务类似下面的代码:
using (TransactionScope tsc = new TransactionScope())
using (SqlConnection connection = new SqlConnection(...))
{
connection.Open();
OrderService os = new OrderService(connection);
os.ProcessOrder(myOrder);
ShippingService ss = new ShippingService(connection);
ss.ShipOrder(myOrder);
tsc.Complete();
}
这是最有可能会是你想要的,在最终 - 在许多服务之间共享一个连接的能力。
这也有助于解耦您的服务来自数据连接的实现细节。这样,如果您想在某些情况下执行某些操作(例如更改连接设置),则无需深入研究50种不同服务的细节,只需更改创建连接的一行代码即可。
还有一件事:如果打算使用TransactionScope
,请确保将Transaction Binding=Explicit Unbind
添加到连接字符串中,否则如果事务超时,实际上可能会导致数据不一致。
虽然'TransactionScope' * *是这里使用的类,但是对于OP的当前设计,它将导致分布式事务或者在MSDTC被禁用或锁定时可能导致异常。它可能*不是预期的结果。 – Aaronaught 2010-04-02 00:34:39
@Aarounaught,使用SQL Server 2008和.NET 3.5,事务不会被提升为分布式事务(对于当前的设计)。 – 2010-04-02 03:11:30
@Tuzo:确实,在SQL Server 2008中,您可以欺骗多重连接问题**如果**所有连接都在同一个数据库中**并且**只有一个连接同时打开。这仍然是一个相当可疑的做法,尤其是当替代设计更容易构建/维护时。 – Aaronaught 2010-04-02 03:36:56