需要ID时,如何防止将业务逻辑代码放在DAL层上?

时间:2018-11-20 14:14:50

标签: c# sql-server stored-procedures architecture

我的应用程序是从3层构建的:GUI,BLL和DAL。 DAL使用存储过程来处理数据库,而BLL包含业务逻辑C#代码。

有时候,我必须将业务逻辑代码放在DAL层上,因为我需要一个“ ID”(自动标识)才能继续编写业务C#代码。我认为这位建筑师太紧了!那么,有什么方法可以使其松动吗?

例如:

1。插入一个新的对象A(学生)。 (ID,姓名,年龄,性别)

2。插入需要ID为A的新对象B(分数)。(ID,分数,studentID,subjectID)

3。主题ID = 1(数学)的点数> 5的计数

  • 插入“ student”(也就是“ core”)的存储过程非常简单。
  • 计数点> 5的存储过程也很简单。

在BLL层:

public int? methodA(Object A, Object B){
   return DAL.methodA(A,B)
}

在DAL层:

public int? methodA(object A, Object B){
   int? result = null;
   using(sqlconnection conn){
     using(sqltraction trans){
        IDstudent = sp_InsertStudent(A)
        ObjectB.Idstudent = IDstudent 
        IDscore = sp_InsertScore(B)
        result = sp_CountPointOver5(IDst)    
     }
   }
   return result;
}

以上是一个小例子。实际上,在获取studentID之后,我必须在sqltransaction的DAL层上编写很多业务逻辑。例如:获得StudentID之后,我将调用4方法来完成业务逻辑。这四种方法都是用C#代码编写的。

1 个答案:

答案 0 :(得分:0)

有几种很好的方法可以解耦此问题。最常见的方法是让您的DAL图层仅具有一个用于学生的“持久”方法,该方法将返回填充了ID的学生实体。这将允许您插入一个分数,将学生实体传递给(带有ID )。

如果您需要事务处理(您应该强烈评估一个断言),那么最常见的方法是传递一个DBContext。您当然可以使用Connection,但这会使您与持久层的绑定过于紧密(IMHO)。无论如何,这都允许您将事务范围限定在BLL范围内,而实际上并不太紧密地绑定到DAL层。