1

您是否认为它是紧密耦合的,以至于我的业务服务类打开SqlConnection?在商业服务中打开sql连接

其实商业服务不应该意识到具体的数据提供者?!

公共类UnitService:

public void DeleteUnit(Unit unit) 
      { 
       using (SqlConnection con = new SqlConnection()); 
       using (TransactionScope trans = new TransactionScope()) 
       { 
        con.Open(); 

        _unitDataProvider.Delete(unit,con); 
        _employeeDataProvider.UpdateEmployees(con); 

        trans.Complete(); 
       }    
      } 
+0

如果它是另一个对象unitDataProvider负责实际删除并且连接似乎没有传递给另一个对象,那么打开'con'有什么意义? –

+0

啊对不起它的pseoudo代码,当然这两个数据提供者方法接受连接作为参数来执行它们的sqlcommands :) – Pascal

回答

3

你qustion是非常的意见...主题

我喜欢抽象的代码和脱开无处不可能。与往常一样,问题是时间和要求。

对于一个简单的小项目,并不需要业务层内广泛的单元测试,您的联结虽然并不一定最佳实践可能是客户/最终用户需要什么,并可能允许您提供该软件以更及时的方式。

对于一个更大/更复杂的/ etc项目,可能最好摘要持久层。

这是不可行遵循最佳实践最佳设计模式最佳的编码原则的代码每行你写。我发现such books的作者经常提到这种模式可能会对需求产生过剩,在需要时应该简单地作为工具使用。

希望有帮助吗?

0

你把它看作是紧耦合的,我的商业服务类在 的SqlConnection?

是的。如果你有一些计算来完成这项工作,你可以在到达表示层之前在业务层进行。

一个我想建议更多的是用“使用”为IDisposable的对象的语句中的SQLConnection class

我的意思是它应该有如下情况。

using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) { 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    string expression = "Parameter value"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "Your Stored Procedure"; 
    cmd.Parameters.Add("Your Parameter Name", SqlDbType.VarChar).Value = expression; 
    cmd.Connection = con; 
    using (IDataReader dr = cmd.ExecuteReader()) { 
     if (dr.Read()) { 
     } 
    } 
} 
+0

啊伪代码:PI使用了一个用于连接的东西,在我的真实代码中也只是看到了使用trans。 .. – Pascal

+0

太好了。我想如果你在这里使用它以及连接... – Pankaj