2009-04-11 40 views
13

Hệ thống cấu hình .NET 2.0 trở lên khá mạnh và có thể mở rộng - miễn là bạn không muốn thay đổi thực tế tất cả đều xuất phát từ các tệp XML trong hệ thống tệp.Đọc cấu hình .NET từ cơ sở dữ liệu

Trong yêu cầu của mình, tôi không thể thay đổi tệp vì ứng dụng của tôi chạy trong môi trường được quản lý ngoài tầm với của tôi - nhưng tôi có thể thay đổi cơ sở dữ liệu SQL Server.

Vì vậy, tôi đang xem xét lưu trữ các tệp cấu hình hoặc các phần trong bảng SQL - nhưng làm cách nào tôi có thể buộc hệ thống cấu hình .NET 2.0 vào đây?

Có cách nào để viết "nhà cung cấp cấu hình tùy chỉnh" sẽ đọc phần cấu hình của nó không từ tệp * .config trong hệ thống tệp, nhưng từ một bảng trong cơ sở dữ liệu SQL ??

Tôi đã xem xét việc tạo ConfigurationSection hoặc ConfigurationElement tùy chỉnh của riêng mình hoặc thậm chí là Cấu hình tùy chỉnh - nhưng có vẻ như tôi luôn kết thúc tại thời điểm tôi có thể mở rộng hệ thống cấu hình trong hệ thống tệp như tôi thích, nhưng tôi không thể làm cho nó đọc các đoạn XML của tôi từ một bảng cơ sở dữ liệu .....

Tôi đang thiếu gì? Có ai đó đã thực hiện điều này và quan tâm để giải thích/chia sẻ không?

Cảm ơn! Marc

PS: Tôi cũng đã cố đọc XML cấu hình thành một chuỗi và sau đó deserializing nó vào ví dụ thích hợp ServiceModelConfigSection - điều đó không hoạt động, thật không may, bởi vì lớp cơ sở ConfigSection bằng cách nào đó không thực hiện một phương thức được yêu cầu cho nó là XML serializable ........ (YIKES !!!)

+0

Nhưng bạn sẽ không có vấn đề về nơi ở để đặt thông tin cấu hình cho kết nối SQL của mình? Một khi bạn đã có một kết nối đến DB bạn chỉ có thể tải bất cứ cài đặt nào bạn cần. App.Config không nhiều hơn một bảng tra cứu. – sipwiz

+0

Có - những gì tôi đang cố gắng thực hiện là cấu hình các dịch vụ WCF từ bên trong một cơ sở dữ liệu. Các tệp cấu hình WCF đó là QUITE LARGE AND COMPLEX - và tôi thực sự không muốn chia nhỏ tất cả những thứ đó thành các assigments nguyên tử -> Tôi muốn đọc cấu hình XML từ cơ sở dữ liệu và áp dụng nó. –

+0

Ah ok, điều đó có ý nghĩa hơn, tôi có thể thấy lý do tại sao WCF cấu hình từ một db sẽ có ích. Tôi nghi ngờ bạn là đúng và phải có một số cách để có được App.Config đọc trong như là một dòng hoặc khối XML thay vì một tập tin. – sipwiz

Trả lời

5

Có một bài báo ở đây là nói về làm những gì bạn đang nói về:

http://www.wrox.com/WileyCDA/Section/Redirecting-Configuration-with-a-Custom-Provider.id-291932.html

nói tóm lại những gì họ làm là tạo ra một phiên bản nguồn gốc của ProtectedConfigurationProvider, mà thường được sử dụng để mã hóa file config. Trong phương thức Decrypt, thay vì giải mã thông tin cấu hình, nó được lấy ra từ một cơ sở dữ liệu.

+0

+1 - cảm ơn, rất thú vị! Có thể không hoàn toàn có ý nghĩa của "ProtectedConfigurationProvider" như là một lớp cơ sở chỉ .... nhưng tôi sẽ cung cấp cho nó một thử! –

+2

Hi Keltex - nó hoạt động - chủ yếu - nhưng đó là một HACK khá khủng khiếp trong quan điểm của tôi ..... quá xấu không có "thích hợp", tốt đẹp, cách chính thức để trực tiếp cắm vào các nhà cung cấp cấu hình vào hệ thống config ... .. –

+0

@marc_s Tôi đồng ý. Nhưng nó là một công việc xung quanh. – Keltex

1

Bạn có thể thử Cinchoo framework cho nhu cầu của bạn.

Nó hỗ trợ đọc và cấu hình viết mục File, Registry, INI, cơ sở dữ liệu, vv

Dưới đây là cách đơn giản để xác định và sử dụng đối tượng cấu hình sử dụng khuôn khổ Cinchoo

namespace HelloWorld 
{ 
    #region NameSpaces 

    using System; 
    using Cinchoo.Core.Configuration; 

    #endregion NameSpaces 

    [ChoConfigurationSection("sample")] 
    public class SampleConfigSection : ChoConfigurableObject 
    { 
     [ChoPropertyInfo("name", DefaultValue="Mark")] 
     public string Name; 

     [ChoPropertyInfo("message", DefaultValue="Hello World!")] 
     public string Message; 
    } 

    static void Main(string[] args) 
    { 
     SampleConfigSection sampleConfigSection = new SampleConfigSection(); 
     Console.WriteLine(sampleConfigSection.ToString()); 
    } 

} 

thời gian Rất đầu tiên khi bạn chạy ứng dụng, khung công tác Cinchoo sẽ tự động tạo phần cấu hình như dưới đây. Sau đó, bạn có thể kiểm soát chúng thông qua nguồn cấu hình hoặc theo mã.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" /> 
    </configSections> 
    <sample> 
    <add key="name" value="Mark" /> 
    <add key="message" value="Hello World!" /> 
    </sample> 
</configuration> 

Hãy dùng thử!

3

Bạn có thể sử dụng cùng một phân tích cú pháp xml .NET sử dụng khi đọc phần web.config và cấu hình với một số phản ánh.

Đây là số sample code để thực hiện.

Đây là lớp bạn muốn trình bày trong xml.

public class TestConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("optionalProperty", DefaultValue = "defaultValue")] 
    public string OptionalProperty 
    { 
     get { return (string)base["optionalProperty"]; } 
     set { base["optionalProperty"] = value; } 
    } 

    [ConfigurationProperty("requiredProperty", IsRequired = true)] 
    public string RequiredProperty 
    { 
     get { return (string)base["requiredProperty"]; } 
     set { base["requiredProperty"] = value; } 
    } 
} 

Đây là cách bạn khởi tạo ConfigurationSection này bằng XML từ chuỗi (hoặc cơ sở dữ liệu). Điều này được lấy từ các bài kiểm tra trên GitHub đã được liên kết trong bài đăng trên blog.

[TestMethod] 
public void Can_build_configuration_with_default_value_set() 
{ 
    var result = _configurationSectionBuilder 
     .BuildSection<TestConfiguration>("<config requiredProperty=\"required\" optionalProperty=\"setValue\"></config>"); 

    Assert.AreEqual("setValue", result.OptionalProperty); 
} 

Bạn nhận được tất cả các nâng cấp .NET với phương pháp này bằng cách sử dụng không gian tên System.Configuration.

+1

Rất tuyệt! Nó hiệu quả tuyệt vời đối với tôi. Nhận dạng duy nhất liên quan đến sự cần thiết phải đảm bảo rằng XML của tôi không có bất kỳ khoảng trắng/khoảng trắng hàng đầu nào. Mặc dù một số người nói rằng dựa vào các phương pháp CLR riêng như thế này là nguy hiểm, nó ít nhiều sơ sài đối với tôi hơn là mã tôi đang cố gắng tái cấu trúc. Điều này làm cho một giàn giáo lớn để chống lại một số thứ này trong khi tôi tấn công vấn đề chính. Cảm ơn một lần nữa! – killthrush

Các vấn đề liên quan