لفترة وجيزة حول مكان وضع المستودع في Architeckture البصل و DDD


مرحبا يا هابر. أريد أن أتحدث عن مكان المستودع في الشكل أعلاه. المزيد عن DIP و IoC وهيكل المشروع. هناك نهج قياسي وفقًا لذلك يجب منع واجهات IRepository في طبقة المجال إلى DomainServices وتنفيذها في البنية التحتية. هنا نتحدث عن المستودعات القياسية التي هي مجرد مجموعة مجردة من الكائنات التي لا تعرف عن المعاملات و UnitOfWork وما إلى ذلك (على سبيل المثال ، IList ونسختها العامة هي الواجهة النموذجية لمستودع تجريدي). أنا اختلف معه شخصيا لأن المستودعات عادة ما تكون متضخمة بالسلوك الخاص بتطبيق معين ، لذلك أضع واجهاتها إلى ApplicationServices. تنفيذ بالطبع لا يزال في طبقة البنية التحتية. إذا كنت مهتمًا ، فمرحبًا بك في القط.

غالبًا ما يتم الخلط بينه وبين الصورة القديمة لروبرت مارتن:

لديه الكلمات في المقالة
تقوم الكيانات بتغليف قواعد الأعمال على مستوى المؤسسة. يمكن أن يكون الكيان كائنًا له طرق ، أو يمكن أن يكون مجموعة من هياكل ووظائف البيانات. لا يهم طالما يمكن استخدام العديد من التطبيقات المختلفة في المؤسسة للكيانات.

لذلك ، اتضح أنه ببساطة يعين DomainServices إلى طبقة الكيانات. حسنًا ، UseCases == ApplicationServices. بوابات == UserPepository ، EmailService ، Logger. اقرأ المزيد هنا .

  1. Serivice هي أي فئة عديمة الجنسية. InfrastructureService عبارة عن أداة لمكافحة الفساد تعزلك عن نظام الملفات ، ومكتبة العمل مع SMTP ، وبالطبع عن ORM أو المكتبة للعمل مع قاعدة البيانات ، وما إلى ذلك.
  2. Repository . . List Repository T[] ValueObject Entities. Repository InfrastructureService InfrastructureService Repository. : Logger, EmailSender.
  3. Repository InfrastructureService - EmailSender EmailService, FileService ( File.Open(… ) . .) .


لفهم مكان وضع التجريد ، نحتاج إلى التفكير في انقلاب التبعية وانقلاب التحكم. وفقًا لهم ، يمكن أن تستخدم ApplicationService البنية التحتية ، ولا أعرف ما هو تنفيذها بطرق مثل:
  1. تحديد الواجهة التي ستنفذ البنية التحتية والتفاعل معها.
  2. ما عليك سوى قبول المندوبين مثل Action و Func.


عبر الواجهات:

    interface IRepository
    {
        int Get();
    }

    class ApplicationService
    {
        private readonly IRepository _repository;

        public ApplicationService(IRepository repository)
        {
            _repository = repository;
        }

        public int GetInt() => _repository.Get();
    }

من خلال المندوبين:

    class ApplicationService
    {
        private readonly Func<int> _getIntFromDb;

        public ApplicationService(Func<int> getIntFromDb)
        {
            _getIntFromDb = getIntFromDb;
        }

        public int GetInt() => _getIntFromDb();
    }

الآن حول كيفية بناء الكود. هناك حالتين بحاجة للنظر:
  1. كل شيء مقسم إلى مجلدات.
  2. كل شيء مقسم إلى مكتبات.

يمكن العثور على تفاصيل المصطلحات هنا .

المجلدات داخل نفس التطبيق


مثال على رمز SnakeGame


عن طريق المكتبات


نضع واجهات InfrastructureServices (IRepository) في مكتبة ApplicationServices ، وتنفيذ (Repository) في مكتبة Infrastructure.



الصورة النهائية من مقال من قبل شخص لديه خبرة في التنمية أكثر بكثير من رأيي والذي يعتقد أيضًا أنه يجب وضع IRepository في طبقة التطبيقات إلى ApplicationServices (تطبيقات مستودع التخزين نفسها لديها أيضًا بنية أساسية).


الموجودات


يمكن وضع واجهة خدمات البنية التحتية (IRepository ، IEmailSender) في مكتبة ApplicationServices.dll ، وتنفيذها المحدد (Repository ، EMailSender) في مكتبة Infrastructure.dll.

All Articles