سؤال

أحاول تصميم تطبيق في 3 طبقات:

1) طبقة الوصول إلى البيانات
2) طبقة العمل
3) واجهة المستخدم

أحاول الحفاظ على فصل الفصول الدراسية ، لذا على طبقة العمل ، قمت بإنشاء واجهات لفئات الوصول إلى البيانات مثل هذا:

public interface ICountryRepository:IRepository 
{
    Country  GetCountry(int ID);

    int CreateCountry(Country obj);
    Boolean UpdateCountry(Country obj);
    Boolean DeleteCountry(Country obj);
    ...
    ...
 }

وأمر الواجهة كمعلمة إلى مُنشئ الخدمة:

   public CountryService(ICountryRepository repository,ILanguageRepository lang_repository)
   {       
    ....
   }

لكن في Conditeryervice على سبيل المثال ، أحتاج إلى تحميل المستخدم الحالي وأذوناته حتى أتمكن من التحقق مما إذا كان يمكن تطبيق العملية:

    public Country GetCountry(int ID)
    {

        if securityService.UserHasPermission(currentUser, GetPermission("CanGetCountry"))
        {
           return repository.GetCountry(ID);
        }
        else
        { 
           Throw(New SecurityException("No permissions for that operation ...."))
        }

    }

هذا يعني أن علي إنشاء كائن SecurityDataAccess ونقله إلى مُنشئ خدمة SecurityService على مجموعة طبقة العمل الخاصة بي والتي أحاول تجنبها لإبقاء الأشياء مفصولًا. في الوقت الحالي ، ليس لدي إشارة إلى أي مجموعة DataAccess في مجموعة أعمالي.

أفكر في استخدام حاوية IOC هنا. باستخدام التكوين الخارجي ، يمكنني الحصول على الفئة/التجميع الصحيحة من ملف التكوين. لكنني لست متأكدًا من أن هذا هو الحل الصحيح لأنه يقال إنه يجب استخدام حاويات IOC في مكان واحد للحفاظ على الأمور بسيطة ويجب أن تكون مجموعة المستوى الأعلى (مجموعة واجهة المستخدم) معظم الوقت.

أي شخص لديه اقتراح لحل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

لماذا لا تضيف خدمة الأمن إلى مُنشئ الخدمة الريفية؟ وبهذه الطريقة ، يمكن للحاوية IOC حل التبعية وحقن الأمان إذا لزم الأمر. هذا يعني أن حاوية IOC ستهتم ببناء كائن CountryService الخاص بك. وستستخدم الحاوية للحصول على جميع الخدمات.

يمكن أن يكون هناك خيار آخر هو "تطبيع" مستودعك قليلاً ...

تقليمها لأسفل لها فقط 4-5 وظائف أساسية متطابقة لجميع المستودعات ، ثم استخدم الأدوية الجينية لجعلها جميعها تبدو متشابهة ، لذلك لا

updateCountry (...) لكن التحديث (كائن T)

شيء من هذا القبيل:http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the-generic-repository.aspx

ثم يمكنك استخدام سلسلة من نمط reponsibilty لوضع رمز الأمان الخاص بك قبل رمز DB ( http://en.wikipedia.org/wiki/Chain-of-Responsibility_pattern )

لذلك ، يمكن أن يكون لديك جهاز أمان يقوم بالتحقق من صحة الوصول ، أو يلقي استثناءً إذا كان غير صالح ، أو يمرر الطلب في الرابط التالي في السلسلة (يمكنك أيضًا إضافة تسجيل ديناميكي بهذه الطريقة ، أو توقيت أو أي شيء آخر)

نصائح أخرى

هل تحتاج إلى تنفيذ الأمان في طبقة الوصول إلى البيانات؟ إذا قمت بنقل خدمة الأمان الخاصة بك إلى طبقة العمل كما يقترح Heiko. بمعنى آخر ، قم بأداء الأمان في طبقة العمل وتجنب مشكلة IOC تمامًا.

قد يكون هذا خارج الحزمة ، والاعتذار إذا كان كذلك ، فأنا مبرمج Java EE المترابط. يبدو لي أن التفويض من الأساليب يتم معالجته بشكل أفضل في البنية التحتية ، بشكل إعلاني.

هذه مقالة - سلعة يبدو أنه يشير إلى أن .NET ، مثل Java EE يوفر منشأة للتحكم في الوصول بشكل إعلاني. هل هذا النهج يعمل من أجلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top