Bir görev günlüğü sistemimiz olduğunu varsayalım, bir görev günlüğe kaydedildiğinde, kullanıcı bir kategori belirtir ve görev varsayılan olarak 'Üstün' durumuna geçer. Bu durumda Kategori ve Durum'un varlık olarak uygulanması gerektiğini varsayın. Normalde bunu yaparım:
Uygulama katmanı:
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);
}
}
Varlık:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
Bunu böyle yapıyorum çünkü sürekli olarak varlıkların depolara erişmemesi gerektiği söylendi, ancak bunu yapsaydım çok daha mantıklı olurdu:
Varlık:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
Durum deposu yine de bağımlı olarak enjekte edilir, bu yüzden gerçek bir bağımlılık yoktur ve bu bana göre bir görev varsayılan olarak varsayılan olarak karar veren etki alanıdır. Önceki sürüm, bu kararı veren uygulama katmanı gibi geliyor. Herhangi bir olasılık olmasaydı, neden alandaki depo sözleşmeleri sık sık oluyor?
İşte daha uç bir örnek, burada etki alanı aciliyete karar veriyor:
Varlık:
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;
}
}
Aciliyetin tüm olası sürümlerini iletmek istemenin hiçbir yolu yoktur ve bu iş mantığını uygulama katmanında hesaplamak istemezsiniz, bu yüzden bu kesinlikle en uygun yol olur mu?
Bu, etki alanından depolara erişmek için geçerli bir neden mi?
EDIT: Bu statik olmayan yöntemlerde de olabilir:
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;
}
}