تغيير سلسلة الاتصال من فئة المكتبة الرئيسية التطبيق في وقت التشغيل

StackOverflow https://stackoverflow.com/questions/450598

سؤال

يمكنك تغيير سلسلة الاتصال في وقت التشغيل مثل هذا.يمكنك جعل سلسلة الاتصال الإعداد المتاحة للكتابة بوصفها ممتلكات منفصلة داخل MySettings الدرجة:

Partial Friend NotInheritable Class MySettings
    Public WriteOnly Property RunTimeConnectionString()
        Set(ByVal value)
            My.Settings("MyConnectionString") = value
        End Set
    End Property
End Class

ثم في مكان ما عند التطبيق يتم تهيئة (قبل استخدام أي جدول محولات من كتابة البيانات) ، أكتب شيئا مثل:

My.Settings.RunTimeConnectionString = My.Settings.ProductionConnectionString

حيث ProductionConnectionString هي سلسلة بسيطة الإعداد.وهو المستخدم نطاق الإعداد لذلك كل مستخدم يمكن تغييره (عن طريق تعيين القيمة إلى ذلك ، على غرار رمز أعلاه) وحفظه من خلال الاتصال بي.الإعدادات.حفظ()

هذا الكود يعمل بشكل جيد سلاسل الاتصال التي تم إنشاؤها في البداية في المشروع الرئيسي وتخزينها في إعدادات (= التطبيق.ملف التكوين).

سلسلة الاتصال في التطبيق.التكوين في الواقع أطول اسم:اسم التطبيق.MySettings.MyConnectionString.

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

الشيء الذي لا أعرف كيفية القيام به هو تغيير الإعداد من مكتبة الفئة في وقت التشغيل.لا يمكن نسخ سلسلة الاتصال الإعداد من الدرجة المكتبة الرئيسية المشروع التطبيق.config.يجب أن تبقي نفس الاسم ، والتي تبدو شيئا مثل:MyClassLibrary.بلدي.MySettings.MyConnectionString.

يمكن نفس المبدأ عرضتها أعلاه بطريقة أو بأخرى تطبيق هذا ثاني اتصال السلسلة ؟

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

المحلول

أنا اختبرت أكثر من ذلك بقليل ، نفس الحل يمكن يمكن استخدامها داخل الصف المكتبة.

أنا جعلت فئة جديدة (في مكتبة الفئة) مشترك (ثابت) طريقة مثل هذا:

Public Class MySettingsChanger
    Public Shared Sub SetConnectionString(ByVal cnnString As String)
        My.Settings.RunTimeConnectionString = cnnString
    End Sub
End Class

ومدد MySettings الطبقة (في مكتبة الفئة) بنفس الطريقة في المشروع الرئيسي:

Namespace My
    Partial Friend NotInheritable Class MySettings
        Public WriteOnly Property RunTimeConnectionString()
            Set(ByVal value)
                My.Settings("MyConnectionString") = value
            End Set
        End Property
    End Class
End Namespace

على الأقل يعمل في حالتي.اسم الاتصال في المشروع الرئيسي في مكتبة الفئة هو نفسه فقط (الاسم المختصر, ليس كل ProjectNamespace.MySettings.ConnectionName).أنا لم تختبر مع وجود اسم مختلف الاتصال في مكتبة الفئة ، ولكن أعتقد أنه يجب أن لا يهم.

نصائح أخرى

بحثت أكثر و وجدت طريقة لكن هذا ليس وقت التشغيل.على الأقل ليس كما runtime كما أود أن يكون.على أي حال, هنا هو رمز اختبرت و نجحت, ولكن مطلوب مني إعادة تشغيل التطبيق لأول مرة. هذا ليس وقت لي.

    Dim configLocation As String = Reflection.Assembly.GetExecutingAssembly().Location
    Dim config As Configuration.Configuration = Configuration.ConfigurationManager.OpenExeConfiguration(configLocation)
    config.ConnectionStrings.ConnectionStrings.Clear()
    For i As Integer = 0 To Configuration.ConfigurationManager.ConnectionStrings.Count - 1
        Dim connection As New Configuration.ConnectionStringSettings(Configuration.ConfigurationManager.ConnectionStrings(i).Name, My.Settings.ProductionConnectionString)
        connection.ProviderName = Configuration.ConfigurationManager.ConnectionStrings(i).ProviderName
        config.ConnectionStrings.ConnectionStrings.Add(connection)
    Next
    config.Save()

هذا هو المقال حيث وجدت هذه المدونة.

شكرا على الرسالة على بلوق.نعم, هو بالكاد وقت التشغيل كما أنه يتطلب منك أن تتوقف عن تشغيل التغييرات أن يتم انتقاؤها.للأسف, لأن الإعدادات يتم تحميلها مرة واحدة ومرة واحدة فقط (عند التطبيق المجال هو تحميل), ليس هناك طريقة إعدادات البنية التحتية لالتقاط التغيرات أثناء التشغيل.

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

لقد فعلت أفضل ما عندي :-)

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