कहें कि हमारे पास एक कार्य लॉगिंग सिस्टम है, जब कोई कार्य लॉग किया जाता है, तो उपयोगकर्ता एक श्रेणी निर्दिष्ट करता है और कार्य 'बकाया' की स्थिति के लिए डिफॉल्ट करता है। इस उदाहरण में मान लें कि श्रेणी और स्थिति को संस्थाओं के रूप में लागू किया जाना है। आम तौर पर मैं यह करूंगा:
अनुप्रयोग परत:
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);
}
}
निकाय:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
मैं इसे इस तरह से करता हूं क्योंकि मुझे लगातार कहा जाता है कि संस्थाओं को रिपॉजिटरी तक नहीं पहुंचना चाहिए, लेकिन अगर मैंने ऐसा किया तो यह मेरे लिए बहुत मायने रखेगा:
निकाय:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
स्थिति रिपॉजिटरी वैसे भी भरोसेमंद रूप से इंजेक्ट की जाती है, इसलिए कोई वास्तविक निर्भरता नहीं है, और यह मुझे और अधिक लगता है कि यह एक ऐसा डोमेन है जो थिएडेकेशन कर रहा है जो कि कार्य को बकाया करता है। पिछला संस्करण ऐसा महसूस करता है कि यह निर्णय लेने वाला एप्लिकेशन लेयर है। यदि यह पॉसिबिलिटी नहीं होनी चाहिए तो डोमेन में अक्सर रिपॉजिटरी कॉन्ट्रैक्ट्स क्यों होते हैं?
यहां एक अधिक चरम उदाहरण है, यहां डोमेन तात्कालिकता तय करता है:
निकाय:
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;
}
}
ऐसा कोई तरीका नहीं है जिससे आप उर्जेंसी के सभी संभावित संस्करणों में पास होना चाहते हैं, और कोई भी तरीका नहीं जिसे आप इस व्यावसायिक तर्क को एप्लिकेशन लेयर में आंकना चाहें, तो निश्चित रूप से यह सबसे उपयुक्त तरीका होगा?
तो क्या यह डोमेन से रिपॉजिटरी तक पहुँचने का एक वैध कारण है?
संपादित करें: यह गैर स्थैतिक तरीकों पर भी हो सकता है:
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;
}
}