سؤال

لدي تطبيق مكتوب في الفانيليا ASP.NET التي أرغب في ميناءها إلى ASP.NET MVC.

ومع ذلك، أنا مرتبك حول المكان المناسب للكائنات الثابتة. أحتاج إلى استمرار لسببين:

  1. أود أن يكون كل شيء غير مرتبطة اتصال قاعدة البيانات، ملفوفة في كائن نمط "مستودع" أو "مدير".
  2. يحتوي كل مستخدم على كائن مستخدم يحتاج إلى حفظه على أساس لكل جلسة.

عادة، أود أن أقول أن # 1 سيتم حفظه كعنصر ثابت في Globals.asax التي يمكن ضربها باستخدام Global.Repository أو مشابه.

وأود أن أقول عادة أن # 2 يجب أن تكون عقارا مع متجر دعم الجلسة في مكان ما في الفئة الأساسية من الصفحات.

والآن والسبب في حيرة من أمري هو أنني سمعت أن الجلسات قد تغيرت في MVC، ولم يعد Global.asax يحمل نفس الفصل. أيضا، تمت إزالة مفهوم الصفحات، لذا فإن إضافة خاصية إلى الفئة الأساسية من وحدة تحكم تبدو ... خطأ.

ماذا يقول يال؟

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

المحلول

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

public class BaseController : Controller
{
    private AuthServices _auth;
    private LogHelper _log;
    private Repository _repository;

    /// <summary>
    /// <see cref="AuthServices"/>
    /// </summary>
    protected AuthServices Authorization
    {
        get { return _auth ?? (_auth = new AuthServices()); }
    }

    /// <summary>
    /// <see cref="LogHelper"/>
    /// </summary>
    protected LogHelper Log
    {
        get { return _log ?? (_log = new LogHelper()); }
    }

    /// <summary>
    /// <see cref="Repository"/>
    /// </summary>
    protected Repository Repository
    {
        get { return _repository ?? (_repository = new Repository()); }
    }
}

لاحظ مثيل كسول. هذا يتيح لي التسلل قبل تشغيل الاختبارات وتعيين حقلي الخاص مع السخرط.

بالنسبة للجلسة، لا يزال من الممكن حفظ كائن المستخدم الخاص بك في الجلسة كما هو الحال في تطبيق ASP.NET التقليدي. تقريبا كل شيء لا يزال موجودا (الاستجابة، ذاكرة التخزين المؤقت، الجلسة، إلخ)، ولكن تم لف بعضها مع فصول من system.web.abstractions بحيث يمكن تسهيلها للاختبار. إنهم جميعا ما زالوا يتصرفون بنفس الطريقة، على الرغم من أنك يجب أن لا تستخدم بعضهم في دورهم التقليدي (على سبيل المثال، لا استجابة. إعادة التوجيه وإرجاع ActionResult مثل Redirectorouteresult الذي يؤدي إعادة توجيهك).

أما بالنسبة للمنطق وراء أسئلتك ....

لا تؤكد على اتصال DB واحد. اعتمادا على تنفيذك، قد يكون الأمر فكرة سيئة، كما قد تتوقف الطلبات على بعضها البعض. فقط افتح الاتصالات الخاصة بك، واستخدامه، وتخلص / إغلاقه عند الانتهاء.

أيضا، واحدة من أكبر التغييرات التي يجلبها MVC هي رفض النموذج الدائم الذي حاول ASP.NET التقليدية إحضاره إلى تطوير الويب. كل هذا الإطار والعرض غير موجود بعد الآن (لا تولي اهتماما للرجل وراء الستار). الدولة الأقل تمسك بتطبيق الويب الأقل تعقيدا وأكثر قوة. جربه، قد ترغب في ذلك.

نصائح أخرى

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

 public static class SessionHandler
{   
    // User Values
    private static string _userID = "UserID";
    private static string _userRole = "UserRole";

    public static string UserID
    {
        get
        {
            if (HttpContext.Current.Session[SessionHandler._userID] == null)
            { return string.Empty; }
            else
            { return HttpContext.Current.Session[SessionHandler._userID].ToString(); }
        }
        set
        { HttpContext.Current.Session[SessionHandler._userID] = value; }

    }

    public static string UserRole
    {
        get
        {
            if (HttpContext.Current.Session[SessionHandler._userRole] == null)
            { return string.Empty; }
            else
            { return HttpContext.Current.Session[SessionHandler._userRole].ToString(); }
        }
        set
        { HttpContext.Current.Session[SessionHandler._userRole] = value; }

    }
}

جلسات لم تتغير على الإطلاق في MVC. فئة GlobalApplication في Global.asax لا تزال موجودة أيضا. توجد صفحات، أيضا، أنك تريد الرجوع إلى مستودع في وحدة تحكم بدلا من صفحة. إضافة خاصية إلى فئة وحدة تحكم أساسية على ما يرام؛ أفعل ذلك طوال الوقت.

يمكنك إنشاء نموذج نماذج لتغليف الحالة.

(انظر كتاب MVC ستيف ساندرسون على تنفيذ سلة التسوق الخاصة به)

مع النموذج الموثق، يمكنك الوصول إلى ControlderContext - الذي يحتوي على HttpContext.

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