สมมติว่าเรามีระบบบันทึกงานเมื่อมีการบันทึกงานผู้ใช้จะระบุหมวดหมู่และค่าเริ่มต้นของงานเป็นสถานะ 'ดีเด่น' สมมติในกรณีนี้ว่าหมวดหมู่และสถานะจะต้องมีการใช้งานเป็นเอนทิตี ปกติฉันจะทำสิ่งนี้:
แอพลิเคชันเลเยอร์:
public class TaskService
{
//...
public void Add(Guid categoryId, string description)
{
var category = _categoryRepository.GetById(categoryId);
var status = _statusRepository.GetById(Constants.Status.OutstandingId);
var task = Task.Create(category, status, description);
_taskRepository.Save(task);
}
}
Entity:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
ฉันทำเช่นนี้เพราะฉันบอกอย่างสม่ำเสมอว่าเอนทิตีไม่ควรเข้าถึงที่เก็บ แต่มันจะทำให้ฉันรู้สึกดีขึ้นถ้าฉันทำสิ่งนี้:
Entity:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
พื้นที่เก็บข้อมูลสถานะเป็นแบบพึ่งพาการฉีดต่อไปดังนั้นจึงไม่มีการพึ่งพาจริงและสิ่งนี้ทำให้ฉันรู้สึกว่ามันเป็นโดเมนที่ทำให้การตัดสินใจว่างานเริ่มต้นเป็นค้าง รุ่นก่อนหน้านี้รู้สึกเหมือนว่ามันเป็นแอพพลิเคชั่นที่ใช้ในการตัดสินใจ ทำไมสัญญาพื้นที่เก็บข้อมูลมักจะอยู่ในโดเมนหากสิ่งนี้ไม่ควรเป็นตำแหน่งที่แน่นอน?
นี่คือตัวอย่างที่รุนแรงยิ่งขึ้นที่นี่โดเมนตัดสินใจเร่งด่วน:
Entity:
public class Task
{
//...
public static void Create(Category category, string description)
{
var task = new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
if(someCondition)
{
if(someValue > anotherValue)
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}
ไม่มีวิธีที่คุณต้องการส่งผ่านในรุ่น Urgency ที่เป็นไปได้ทั้งหมดและไม่มีวิธีที่คุณต้องการคำนวณตรรกะทางธุรกิจนี้ในเลเยอร์แอปพลิเคชันดังนั้นแน่นอนว่านี่จะเป็นวิธีที่เหมาะสมที่สุด?
นี่คือเหตุผลที่ถูกต้องในการเข้าถึงที่เก็บจากโดเมน?
แก้ไข: นี่อาจเป็นกรณีในวิธีการไม่คงที่:
public class Task
{
//...
public void Update(Category category, string description)
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
if(someCondition)
{
if(someValue > anotherValue)
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}