我的应用程序是从3层构建的:GUI,BLL和DAL。 DAL使用存储过程来处理数据库,而BLL包含业务逻辑C#代码。
有时候,我必须将业务逻辑代码放在DAL层上,因为我需要一个“ ID”(自动标识)才能继续编写业务C#代码。我认为这位建筑师太紧了!那么,有什么方法可以使其松动吗?
例如:
1。插入一个新的对象A(学生)。 (ID,姓名,年龄,性别)
2。插入需要ID为A的新对象B(分数)。(ID,分数,studentID,subjectID)
3。主题ID = 1(数学)的点数> 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#代码编写的。
答案 0 :(得分:0)
有几种很好的方法可以解耦此问题。最常见的方法是让您的DAL图层仅具有一个用于学生的“持久”方法,该方法将返回填充了ID的学生实体。这将允许您插入一个分数,将学生实体传递给(带有ID )。
如果您需要事务处理(您应该强烈评估一个断言),那么最常见的方法是传递一个DBContext。您当然可以使用Connection,但这会使您与持久层的绑定过于紧密(IMHO)。无论如何,这都允许您将事务范围限定在BLL范围内,而实际上并不太紧密地绑定到DAL层。