سؤال

لدي إعداد نمط مستودع باستخدام nhibernate. يبدو الفئة الأساسية هكذا:

public interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

// generic NHibernate implementation of IUnitOfWork here

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    private NHibernateUnitOfWork _unitOfWork;

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
    public T Get(object id)
    {
        return _unitOfWork.Session.Get<T>(id);
    }

    // ...
}

كما ترون ، أسمح بملء وحدة العمل عبر المنشئ (باستخدام structuremap). أنا أتعامل مع كائنات المستودع على خدمات الويب الخاصة بـ ASP.NET مثل ذلك:

[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
    public IUserAccountRepository UserAccountRepo { get; set; }

    public ModuleService()
    {
        // tell IoC to inject properties
        ObjectFactory.BuildUp(this);
    }

    // ...
}

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

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    public T Get(object id)
    {
        return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
    }

    // ...
}

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

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

المحلول

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

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