Katakanlah kita memiliki sistem pencatatan tugas, ketika tugas dicatat, pengguna menentukan kategori dan tugas tersebut default ke status 'Luar Biasa'. Anggaplah dalam contoh ini bahwa Kategori dan Status harus diimplementasikan sebagai entitas. Biasanya saya akan melakukan ini:
Lapisan Aplikasi:
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);
}
}
Kesatuan:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
Saya melakukannya seperti ini karena saya secara konsisten diberitahu bahwa entitas tidak boleh mengakses repositori, tetapi akan lebih masuk akal bagi saya jika saya melakukan ini:
Kesatuan:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
Repositori status adalah dependecy yang disuntikkan, jadi tidak ada ketergantungan nyata, dan ini terasa lebih bagi saya karena itu adalah domain yang membuat keputusan bahwa tugas default ke luar biasa. Versi sebelumnya terasa seperti aplikasi layeer yang membuat keputusan itu. Adakah mengapa kontrak repositori sering kali berada dalam domain jika ini tidak boleh menjadi kemungkinan?
Berikut adalah contoh yang lebih ekstrem, di sini domain memutuskan urgensi:
Kesatuan:
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;
}
}
Tidak ada cara Anda ingin lulus dalam semua versi Urgency yang mungkin, dan tidak mungkin Anda ingin menghitung logika bisnis ini di lapisan aplikasi, jadi tentu ini akan menjadi cara yang paling tepat?
Jadi apakah ini alasan yang sah untuk mengakses repositori dari domain?
EDIT: Ini juga bisa terjadi pada metode non-statis:
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;
}
}