Как предотвратить размещение кода бизнес-логики на уровне DAL, когда вам нужен идентификатор? - PullRequest
0 голосов
/ 20 ноября 2018

Мое приложение построено из 3-х уровней: GUI, BLL и DAL.DAL использует процедуру хранения для работы с базой данных, а BLL содержит код бизнес-логики C #.

Иногда я вынуждаю размещать код бизнес-логики на уровне DAL, потому что мне нужен "ID" (автоматическая идентификация), чтобы продолжать писать.бизнес C # код.Я думаю, что этот архитектор слишком тесен!Итак, есть ли способ освободить его?

Например:

1.Вставить новый объект A (студент).(ID, имя, возраст, пол)

2.Введите новый объект B (оценка) с нужным идентификатором A. (ID, точка, идентификатор студента, subjectID)

3. Номер счетаиз точки> 5 с subjectID = 1 (Math)

  • процедура сохранения для вставки «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;
}

Выше приведен небольшой пример.На самом деле, я должен написать много бизнес-логики на уровне DAL внутри sqltransaction после получения studentID.Например: после получения studentID я вызову 4 метода для завершения бизнес-логики.Эти 4 метода все пишут из кода C #.

1 Ответ

0 голосов
/ 20 ноября 2018

Есть несколько хороших способов отделить это.Наиболее распространенный способ состоит в том, чтобы на вашем уровне DAL был только метод «persist» для Student, который будет возвращать сущность студента с заполненным идентификатором. Это позволит вам затем вставить Score, передавая сущность студента (с идентификатором).).

Если вам нужны транзакции (утверждение, которое вы должны строго оценить), то самый распространенный метод - передать DBContext.Конечно, вы можете использовать Соединение, но это слишком тесно связывает вас с вашим постоянным слоем (ИМХО).В любом случае, это позволяет вам охватывать транзакции в области BLL, не привязывая при этом к уровню DAL слишком тесно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...