سؤال

والآن أحاول أن يجدوا طريقة للقيام بأمور أكثر ذكاء، وأثناء ذلك كل ما تمكنا من القيام به هو استخدام زجاجة كاملة من excedrin في يوم واحد.

وافترض لدي واجهة دعا IRepository مثل ذلك.

 public interface IRepository<T>
 {
    T Get(int id);
    void Add(T value);
    void Update(T value);
    void Delete(T value);
    ...
 }

ونفترض لدي تنفيذ مثل

public class NHibernateRepository<T>
{
    ...
}

والآن، كل شيء على ما يرام وجيدة، وأستطيع أن أفعل كل عملياتي الأساسية ضد مستودع لدعم جميع وظائف CRUD، ولكنني قد ترغب العمليات المتخصصة، لذلك نفترض لدي واجهة مثل هذا:

public interface IUserRepository : IRepository<User>
{
     IList<User> GetUsersByRole(Role role);
}

وعلى تنفيذ مثل هذه:

public class UserRepository : NHibernateRepository<User>, IUserRepository
{
    ....
}

وطيب، حتى لا يكون الإعداد الأساسي، والآن هناك أكثر شيء واحد أن أريد القيام به. أريد أن يكون تسجيل والمعاملات واشياء من هذا القبيل كل بشفافية. ذلك ما أود القيام به هو استخدام إطار حقن التبعية مثل قلعة وندسور أو StructureMap حتى أنني عندما أطلب IRepository، وأنا الحصول عليها ملفوفة بواسطة LoggingRepository وTransactionRepository، وكلاهما تنفيذ IRepository.

وهكذا، ما أريد القيام به هو شيء من هذا القبيل:

IUserRepository repository = container.Resolve< IUserRepository>();

وولها أن تعيد مستودع مستخدم الذي ملفوفة في المشتريات وعملية الديكور، ولكن لا أستطيع التفكير في الطريقة التي سيعمل هذا على الإطلاق. الطريقة الوحيدة التي يمكنني أن أفكر في الحصول على هذا العمل هو من خلال تنفيذ UserRepository مثل هذه:

public class UserRepository : DecoratorRepository<T>, IUserRepository
{
    protected IRepository<T> Repository { get; set; }

    public UserRepository(IRepository<T> innerRepository)
    {
        Repository = innerRepository;
    }
}

وهذا يعني أننا سوف تستخدم التبعية حقن لإنشاء مستودع زينت وتمرير ذلك إلى منشئ UserRepository ثم استخدام ذلك المستودع الذي ندير عمليات ضد. وهذا من شأنه العمل، ولكن ما زلت لا أعتقد انها مثالية.

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

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

المحلول

إذا كنت تنوي استخدام الديكور الذي يبدو عن الحق. فإن كل الديكور على منشئ مع وسيطة من IRepository واستدعاء تسجيل أو معاملة كود يدعو حول إلى مستودع الداخلي الذي هو تزيين.

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

نصائح أخرى

لا يمكن لديك فئة قاعدة مجردة LoggingRepository التي من شأنها أن التعامل مع تسجيل للحصول على آخر، إضافة، تحديث، حذف، وجعلها افتراضية ومن ثم يرث منها؟

ولست متأكدا رغم ما المشكلة التي تحاول حلها كما لو كنت تعتقد أنك قد حاولت ذلك؟ هل يمكن أن التفاف في المعاملات كذلك، وإن كان من المرجح أن كنت تريد أن تفعل ذلك في NHibernateRepository الخاص بك.

هذا بلوق يبدو وكأنه حل ل مشكلتك. انها في الاساس نفس التصميم ولكن بدلا من وجود محمية IRepository لك جعله للقراءة فقط خاصة.

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