Giả sử chúng tôi có một hệ thống ghi nhật ký tác vụ, khi một tác vụ được ghi lại, người dùng chỉ định một danh mục và tác vụ mặc định thành trạng thái 'Xuất sắc'. Giả sử trong trường hợp này rằng Danh mục và Trạng thái phải được triển khai như các thực thể. Thông thường tôi sẽ làm điều này:
Lớp ứng dụng:
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);
}
}
Thực thể:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
Tôi làm điều này như thế bởi vì tôi luôn nói rằng các thực thể không nên truy cập vào kho lưu trữ, nhưng nó sẽ có ý nghĩa hơn đối với tôi nếu tôi làm điều này:
Thực thể:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
Dù sao, kho lưu trữ trạng thái là phần phụ thuộc được chèn vào, do đó không có sự phụ thuộc thực sự và điều này đối với tôi nhiều hơn, đó là tên miền đang tạo ra một nhiệm vụ mặc định là một nhiệm vụ mặc định. Phiên bản trước có cảm giác như đó là ứng dụng layeer đưa ra quyết định đó. Bất kỳ lý do tại sao các hợp đồng kho lưu trữ thường trong miền nếu điều này không phải là khả thi?
Đây là một ví dụ cực đoan hơn, ở đây tên miền quyết định cấp bách:
Thực thể:
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;
}
}
Không có cách nào bạn muốn vượt qua trong tất cả các phiên bản khẩn cấp có thể, và không có cách nào bạn muốn tính toán logic kinh doanh này trong lớp ứng dụng, vậy chắc chắn đây sẽ là cách thích hợp nhất?
Vì vậy, đây có phải là một lý do hợp lệ để truy cập kho từ miền?
EDIT: Đây cũng có thể là trường hợp trên các phương thức không tĩnh:
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;
}
}