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

C# 当您需要ID时,如何防止将业务逻辑代码放在DAL层上?,c#,sql-server,stored-procedures,architecture,C#,Sql Server,Stored Procedures,Architecture,我的应用程序是从3层构建的:GUI、BLL和DAL。DAL使用存储过程处理数据库,BLL包含业务逻辑C#代码 有时,我强制将业务逻辑代码放在DAL层上,因为我需要一个“ID”(自动标识),以便能够继续编写业务C#代码。我觉得这个建筑师太紧了!那么,有没有办法把它弄松 例如: 1.插入新对象a(学生)。(身份证、姓名、年龄、性别) 2.插入需要ID为a的新对象B(分数)(ID、点、学生ID、主体ID) 3.在主观性=1(数学)的情况下计算大于5的点数 插入“student”和“core”的存储过

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

有时,我强制将业务逻辑代码放在DAL层上,因为我需要一个“ID”(自动标识),以便能够继续编写业务C#代码。我觉得这个建筑师太紧了!那么,有没有办法把它弄松

例如:

1.插入新对象a(学生)。(身份证、姓名、年龄、性别)

2.插入需要ID为a的新对象B(分数)(ID、点、学生ID、主体ID)

3.在主观性=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;
}

以上是一个小例子。在realty中,在获取studentID后,我必须在sqltransaction内的DAL层编写大量业务逻辑。例如:获取studentID后,我将调用4方法来完成业务逻辑。这4种方法都是从C代码中编写的。

有几种很好的方法可以将其解耦。最常见的方法是让DAL层只为Student提供一个“persist”方法,该方法将返回一个填充了ID的Student实体。这将允许您插入分数,通过学生实体(ID)


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

您好,欢迎使用SO。这里甚至没有一个真正的问题。只是一个模糊的引用,没有什么类似于答案的内容。作为后续的肖恩的评论,考虑添加一些小代码块,这总是有助于尝试可视化你正在做的事情。好吧,我现在将更新我的问题!操作员过载