سؤال

أنا بصدد إضافة طبقة الوصول إلى البيانات لتطبيق الويب ASP.Net 2.0 الخاص بنا والذي تمت كتابته بشكل حصري تقريبًا باستخدام مكالمات SQL المضمنة والاستخدام الغزير للنسخ/اللصق.نظرًا لمخاوف تتعلق بالعمل، فأنا لا أستطيع سوى إعادة معالجة أجزاء صغيرة من التطبيق في المرة الواحدة (لا أستطيع الاستقرار وإجراء عملية إعادة تصميم ضخمة)، لذا يجب علي التعايش مع بعض قرارات التصميم حتى تصبح الأمور مقترنة بشكل فضفاض بما فيه الكفاية لإجراء تغييرات كبيرة واختبارها بشكل صحيح.

لقد قررت استخدام كتلة تطبيق الوصول إلى بيانات مكتبة المؤسسة باعتبارها السباكة لطبقة الوصول إلى البيانات من الآن فصاعدا، وأحد قرارات التصميم السابقة هذه يسبب لي مشاكل.نحصل حاليًا على سلسلة الاتصال "الرئيسية" لتطبيقنا من قاعدة بيانات المسؤول استنادًا إلى معرف الحساب المقدم من قبل المستخدم حتى نتمكن من السماح بتثبيت واحد للتطبيق للوصول إلى قواعد بيانات متعددة.مشكلتي تتعلق بمحاولة اكتشاف أفضل الممارسات لإيصال سلسلة الاتصال (أو معرف الحساب) إلى DAL.

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

Public Shared Function GetResultsByKeywords(ByVal key1 As String, ByVal key2 As String, ByVal key3 As String, ByVal key4 As String) As DataTable
    Dim db As SqlDatabase = New SqlDatabase(Connection.GetConnectString())
    Dim dt As DataTable = New DataTable

    Using dr As IDataReader = db.ExecuteReader("sel_eHELP_ITEMS", key1, key2, key3, key4)
        dt.Load(dr)
    End Using

    Return dt
End Function

حيث يقوم Connection.GetConnectString() بجلب سلسلة الاتصال من ملف تعريف الارتباط.

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

سيكون موضع تقدير أي توجيه.شكرًا لك.

تحديث

اسمحوا لي أن أوضح.سيكون هناك على الأكثر 3 أو 4 سلاسل اتصال مختلفة للتثبيت."معرف الحساب" ليس معرف مستخدم ويستخدمه عدة مستخدمين لتحديد قاعدة البيانات التي سيتم الاتصال بها بشكل أساسي.

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

المحلول

يحرر:

مع التحديث الأخير، ما زلت أوصي بالبحث في التكوين باستخدام DAABhttp://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx

أواجه صعوبة في العثور على/فتح مستندات Ent Lib، ولكنني سأرى ما إذا كانت تحتوي على ما يعادل طريقة ChangeDatabase لكائن SqlConnection. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

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

(يرجى عذر ج #)

public class MyDAL
{
    private string _connectionString;

    public MyDAL(string connectionString)
    {
        _connectionString = connectionString;
    }

    public int MyDatabaseCall()
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("my sql", conn))
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    //...data access
                    return 0;
                }
            }
        }
    }
}

public class MyApp
{
    public static Dictionary<string, MyDAL> myDatabases = new Dictionary<string, MyDAL>();

    public string GetConnectionString(string database)
    {
        return System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString;
    }

    public void StartUp() // Global.asax Application_Start ?
    {
        myDatabases.Add("Database1", new MyDAL(GetConnectionString("Database1")));
        myDatabases.Add("Database2", new MyDAL(GetConnectionString("Database2")));
        myDatabases.Add("Database3", new MyDAL(GetConnectionString("Database3")));
    }

    public MyDAL DataAcccessLayer
    {
        get
        {
            string usersDB = FigureOutUsersDatabase();
            return myDatabases[usersDB];
        }
    }

    public void UseSomeData()
    {
        var myData = DataAcccessLayer.MyDatabaseCall();
        //Do Stuff
    }
}

أتمنى أن ذلك يساعد، حظا طيبا!ويكون حذرين للغاية ما تضعه في ملفات تعريف الارتباط.;)

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