在业务服务中打开sql连接

时间:2012-01-26 21:09:46

标签: c# sql-server sqlconnection database-agnostic tightly-coupled-code

您是否将其视为我的业务服务类打开SqlConnection的紧密耦合?

实际上,业务服务不应该知道具体的数据提供者?!

公共类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();
                }             
            }

2 个答案:

答案 0 :(得分:3)

你的qustion很容易受到意见......

我喜欢抽象代码并在任何地方解开。一如既往的问题是时间和要求。

对于在业务层中不需要大量单元测试的小型简单项目,您的耦合虽然不一定遵循最佳实践,但可能正是客户/最终用户所需要的,并且可能允许您以更及时的方式提供软件。

对于更大/更复杂的/ etc项目,最好抽象持久层。

对于每行代码,遵循最佳做法最佳设计模式最佳编码原则是根本不可行的你写的。我发现such books的作者经常提到这些模式可能是对需求的过剩,应该只在需要时用作工具。

希望有帮助吗?

答案 1 :(得分:0)

  

您是否将其视为我的业务服务类打开的紧密耦合   SqlConnection?

是。如果您有一些计算来完成这项工作,您可以在到达表示层之前在“业务”层中执行此操作。

我想建议的另一件事是在SQLConnection class

的情况下对IDisposable对象使用“Using”语句

我的意思是它应该如下所示。

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()) {
        }
    }
}