2012-03-21 20 views
5

Tôi đã sử dụng các khuôn khổ cấu hình cây nhà lá vườn sau đây để quản lý cấu hình của các dự án của tôi cho một vài năm nay:khung cấu hình thay thế, tìm kiếm một sự thay thế

  1. Người bắt chước đầu tiên .properties file Java (một bó của supergroup.subgroup.property=value dòng với hỗ trợ cho các bộ sưu tập) và hoạt động tốt cho nhiều tình huống (tôi thấy nó tốt nhất cho các ứng dụng nhỏ). Cái này tốt cho cấu hình rất đơn giản

  2. Thứ hai dựa trên DataContractSerializer (và tùy chọn XmlSerializer) cho phép tất cả chức năng của cái đầu tiên có tất cả đặc quyền của XML và ít ống nước hơn để làm cho nó hoạt động. Điều này là tốt nhưng không thực tế và cồng kềnh để quản lý mà không có một giao diện người dùng rõ ràng trên đầu trang của nó để giảm thiểu đau đầu của việc dạy người dùng cuối để sửa đổi XML.

Cả hai khung soái hiện đến và đi từ POCOs mà không vấn đề cho phép truy cập đến giá trị cấu hình thông qua các thuộc tính/lĩnh vực (thông qua bằng tay/serialization tự động tương ứng), vì vậy chúng rất dễ dàng để làm việc với một nhà phát triển.

Bây giờ tôi đang xem xét khả năng bật cấu hình cơ sở dữ liệu và cấu hình thông thạo của mình, tôi đang tìm kiếm một giải pháp thay thế (tốt nhất là nguồn mở). Tôi không có vấn đề với việc làm lại tất cả các dự án hiện tại của tôi nếu tôi có thể giảm trùng lặp mã không cần thiết và cho phép họ truy cập vào DB và cấu hình thông thạo (ngoài khả năng hiện có của họ).

Bất kỳ đề xuất nào hoặc liệu nó có đáng để tôi tự mình có được các tính năng tôi đang theo dõi không?

Trong nghiên cứu của mình, tôi tìm thấy this câu hỏi có khả năng trùng lặp được trả lời bởi Nini nhưng chưa được cập nhật trong gần 2 năm và chỉ hỗ trợ các tùy chọn mà tôi đã có (dựa trên tài liệu của nó). Tôi đã bỏ lỡ điều gì đó trong nghiên cứu của tôi hay là có một lựa chọn tốt hơn?

Cập nhật

Các tính năng rõ ràng tôi sau là:

  • file XML
  • INI/Java như properties file
  • Cơ sở dữ liệu (ít nhất là MS SQL và SQLite, tùy chọn MySQL và bất kỳ người nào khác như bạn có thể tưởng tượng)
  • Lưu loát (không cần tạo mã)
  • Một số loại API tiện ích mở rộng cho phép tôi thêm các nguồn của riêng mình
  • Chắc chắn cần phải tuần tự hóa/từ bất kỳ nguồn dữ liệu nào có thể truy cập thông qua thuộc tính/trường.
  • hỗ trợ Enumeration

Tôi muốn được quan tâm trong việc mở rộng một khuôn khổ hiện tại nếu nó là đủ mở để làm những gì tôi cần phải làm, nhưng nếu không nó có thể không phải là một sự phù hợp tốt.


CẬP NHẬT

Chức năng từ System.Configuration namespace hiện là rất tốt, và tôi quen với tốt như thế nào nó có thể làm việc nhưng nhìn chung nó không làm những gì tôi đang tìm kiếm. Tôi đã sử dụng nó (ngay cả trong các kịch bản nâng cao) nhưng là nó chỉ cho phép khả năng mở rộng XML hạn chế: nó không chỉ là những gì tôi sau.

Nếu tôi phải cung cấp bất kỳ chức năng được xác định trước nào, tôi muốn nói cấu hình thông thạo là quan trọng nhất (sẽ rất khó để cung cấp giao diện có giá trị cho điều này một cách chung chung). Tôi sẽ chỉ buông một thứ gì đó lên trên bất cứ thứ gì tôi tìm thấy.

Thực tế là đã hơn 24 giờ (và> 125 lượt xem) và không ai có thể đưa ra một thay đổi hợp lý cho tôi biết điều này có thể không tồn tại. Tôi sẽ bắt đầu một mình với hy vọng rằng ai đó có thể cung cấp một giải pháp thay thế thú vị.

+0

Bạn có thể làm rõ các tính năng bạn đang theo dõi không? Truy cập vào DB (có nghĩa là lưu trữ cấu hình vào một kho lưu trữ trung tâm, tôi đoán) và cấu hình lưu loát. Còn gì nữa không? –

+0

@VincentHubert - Được cập nhật với các yêu cầu tối thiểu. –

+1

về mặt sửa đổi dự án, lưu ý Giao diện không thực hiện - IMHO, đây là loại điều bạn tạo giao diện xác định cách bạn muốn mã của bạn có thể tương tác với bất kỳ điều gì xảy ra là khung cấu hình hiện tại. Sau đó, nếu một cái gì đó không đáp ứng tất cả nhu cầu của bạn, bạn chỉ có thể 'điền vào những khoảng trống' để có được giao diện thực hiện –

Trả lời

2

Tạo một trình quản lý cấu hình mục đích chung là nhiệm vụ rất đòi hỏi. Trong những năm qua, tôi đã không nhìn thấy bất kỳ khuôn khổ cấu hình mới nổi và tôi không điều tôi sẽ. Chỉ cần có một cái nhìn tại không gian tên System.Configuration và bạn có thể thấy đắt như thế nào Nó sẽ là để cố gắng để phù hợp với một tập hợp các tính năng tương tự. Hầu hết thời gian, các yêu cầu cấu hình rất cụ thể và không có viên đạn bạc.

Lời khuyên của tôi sẽ là tuân theo giải pháp của riêng bạn, miễn là nó có thể dễ dàng kiểm tra đơn vị và thực hiện công việc.

+0

Tôi đồng ý rằng việc tạo một tài khoản sẽ tốn rất nhiều thời gian, kể cả những giờ đánh đầu tôi trên bàn làm việc của tôi. Tôi cũng đồng ý rằng một kích thước _one phù hợp với giải pháp all_ out-of-the-box là một yêu cầu không hợp lý và mã tùy chỉnh có thể sẽ vẫn phải được viết/tạo ra. Đó là lý do tại sao tôi hỏi về cấu hình _framework_ thay vì cấu hình _manager_. Lý tưởng nhất nó sẽ giống như WCF; một loạt các đồ chơi tinker có thể được dán lại với nhau theo những cách khác nhau để đạt được một mục tiêu chung, bạn chỉ cần làm cho keo mình. –

+2

Đã không đi qua một khuôn khổ như vậy hoặc (mặc dù trong những năm qua tôi đã xây dựng khá một bộ sưu tập hoặc các lớp học có liên quan). Bằng cách này, ngay cả từ 'như WCF' là đáng sợ (cho kích thước của WCF!). –

+0

Không có tôi, thật không may. 1 cho đưa ra câu trả lời hợp lý (đọc: sane), nhưng tôi sẽ tiếp tục tìm kiếm một giải pháp. –

2

Vui lòng kiểm tra xem nó ra Cinchoo Configuration Framework, nó cung cấp hầu hết các tính năng bạn đang tìm kiếm.

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()); 
    } 

} 

lần đầu tiên, khi bạn chạy các ứng dụng, khung Cinchoo tự động tạo ra các 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> 
0

Các giải pháp tôi có cho bạn đi trong mùa xuân .NET Framework, mà trong số cầu thủ vĩ đại khác tính năng có PropertyPlaceholderConfigurer lớp.

Lớp này nhằm mục đích bên ngoài một số thuộc tính bạn có trong tệp cấu hình xml của mình. Vì vậy, thay vì viết các giá trị bằng chữ (như chuỗi kết nối, mật khẩu hoặc bất kỳ thông số nào khác), bạn đặt trình giữ chỗ, như $ {sql.server}, $ {sql.password} sẽ được tự động thay thế bằng các giá trị bên ngoài.

Các giá trị bên ngoài đó có thể ở bất kỳ đâu. Trong trường hợp của công ty tôi, vì chúng tôi có hệ thống kế thừa sử dụng cùng một giá trị, chúng tôi đã đặt chúng trong cửa sổ đăng ký (mà tôi rõ ràng không được đề xuất cho các dự án mới). Tuy nhiên, hãy lưu ý rằng đây không phải là một tính năng độc lập của Spring, nó đi kèm với Spring.Core, và bạn sẽ phải sử dụng các tệp cấu hình mùa xuân và các tính năng Dependency Injection.

http://www.springframework.net/doc-latest/reference/html/objects.html#objects-factory-placeholderconfigurer

+1

Dường như nó chỉ hoạt động với XML, khá xa so với những gì tôi đang tìm kiếm và triển vọng tích hợp _all_ của các khung công tác khác vào nó nghe có vẻ như rất nhiều công việc. Tôi chắc chắn sẽ có một cái nhìn khó khăn hơn vào nó mặc dù kể từ khi bạn nói rằng công ty của bạn đang sử dụng nó cho cấu hình registry. Bạn có biết số tiền nỗ lực để làm cho nó hoạt động không? Mặc dù nó đòi hỏi nhiều hơn những gì tôi đang theo, nó có thể cung cấp một mô hình tốt cho những nỗ lực của tôi. –

+0

Vâng, nỗ lực chính là đặt Spring làm việc trong dự án của bạn. Nếu bạn không có bất kỳ kinh nghiệm nào trước đó với Spring, nó có thể hơi rắc rối và thậm chí là đau đớn. Nhưng, theo ý kiến ​​của tôi nó có giá trị. Tôi đã tạo một ví dụ rất đơn giản và đặt trên mã google nếu bạn muốn xem ví dụ (http://code.google.com/p/spring-net-placeholder-example/). Hy vọng nó giúp. – Beccari

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