تغيير سلسلة الاتصال من فئة المكتبة الرئيسية التطبيق في وقت التشغيل
-
19-08-2019 - |
سؤال
يمكنك تغيير سلسلة الاتصال في وقت التشغيل مثل هذا.يمكنك جعل سلسلة الاتصال الإعداد المتاحة للكتابة بوصفها ممتلكات منفصلة داخل 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 التطبيق حمام السباحة إذا كان تطبيق ويب.أبعد من ذلك ، عليك أن لفة الخاص بك.
لقد فعلت أفضل ما عندي :-)