5

Tôi đang làm việc trên một dự án nhanh để theo dõi/xử lý dữ liệu. Về cơ bản đó chỉ là màn hình, lịch trình và bộ vi xử lý. Màn hình sẽ kiểm tra dữ liệu (ftp, local, imap, pop, vv) bằng cách sử dụng một lịch biểu và gửi dữ liệu mới đến một bộ xử lý. Tất cả đều có giao diện..config để tạo thủ thuật?

Tôi đang cố gắng tìm một cách lành mạnh để sử dụng cấu hình để định cấu hình lịch trình/bộ xử lý mà mỗi màn hình sử dụng. Đó là khá dễ dàng:

<monitor type="any.class.implementing.monitor"> 
    <schedule type="any.class.implementing.schedule"> 
     ... 
    </schedule> 
    <processor type="any.class.implementing.processor" /> 
</monitor> 

là cách tốt nhất để cấu hình bất kỳ màn hình cũ/lịch/xử lý ném vào trộn là những gì Những gì tôi đang phải vật lộn với. Một mặt, người ta có thể thực hiện params constructor hoặc tài sản (cho ot có bất kỳ cú pháp):

<monitor type="any.class.implementing.monitor"> 
    <args> 
     <arg value="..." /> 
    </args> 
    <properties> 
     <property name="..." value=..." /> 
    </properties> 
    <schedule type="any.class.implementing.schedule"> 
     ... 
    </schedule> 
    <processor type="any.class.implementing.processor" /> 
</monitor> 

giải pháp khác là phương pháp nhà máy ở mỗi giao diện mà có cấu hình tùy chỉnh như một param:

public IMonitor Create(CustomConfigSection config); 

Tôi đã thấy mọi người sử dụng cả hai. Bạn thích cái nào hơn? Bất kỳ thủ đoạn nào của giao dịch khi lập bản đồ cấu hình cho các nhà xây dựng?

Tôi hơi bị rách vì liệu DI có phù hợp với mớ hỗn độn này hay không. Cuối cùng, nó sẽ là một tập hợp các ràng buộc trên mỗi trường hợp màn hình, có vẻ như vô nghĩa ngoại trừ các giá trị mặc định, cấu hình nào có thể bao trùm.

Trả lời

0

Khi tôi đã thực hiện loại điều này, tôi đã triển khai IConfigurationSectionHandler về cơ bản hoạt động như một nhà máy để phân tích cú pháp cấu hình, tạo đối tượng thuộc loại được chỉ định trong cấu hình và trả lại chúng trong một số loại cấu trúc dữ liệu (thường là một Danh sách hoặc Từ điển). Cho dù bạn sử dụng IConfigurationSectionHandler hay không, tôi nghĩ rằng nhà máy là con đường để đi vì bạn sẽ bản địa hóa mã liên quan đến phân tích cú pháp tệp cấu hình và tạo các đối tượng trong một lớp (hoặc một phần cho mỗi phần).

Tôi cũng thích các lớp học với các hàm tạo đơn giản và thuộc tính setter/getters cho cấu hình trên các lớp với nhiều tham số trong hàm tạo. Điều này giúp cho nhà máy hoạt động và giảm sự ghép nối giữa nhà máy và lớp đang được xây dựng.

0

Trước tiên, tôi sẽ xác định các yếu tố cấu hình đại diện cho màn hình:

public class MonitorElement : ConfigurationElement 
{ 
    // ...whatever schema you prefer... 
} 

public class MonitorElementCollection : ConfigurationElementCollection 
{ 
    // ...standard implementation... 
} 

Và một phần cấu hình để lưu trữ chúng:

public class YourSection : ConfigurationSection 
{ 
    [ConfigurationProperty("monitors")] 
    [ConfigurationCollection(typeof(MonitorElementCollection))] 
    public MonitorElementCollection Monitors 
    { 
     get { return (MonitorElementCollection) this["monitors"]; } 
    } 
} 

Sau đó, tôi sẽ xác định một giao diện đại diện cho bộ màn hình:

public interface IMonitorRepository 
{ 
    IEnumerable<Monitor> GetMonitors(); 
} 

Và tạo triển khai đọc tệp cấu hình e:

public sealed class ConfiguredMonitorRepository : IMonitorRepository 
{ 
    private readonly string _sectionName; 

    public ConfiguredMonitorRepository(string sectionName) 
    { 
     _sectionName = sectionName; 
    } 

    public IEnumerable<Monitor> GetMonitors() 
    { 
     var section = (YourSection) ConfigurationManager.GetSection(_sectionName); 

     if(section != null) 
     { 
      foreach(var monitor in section.Monitors) 
      { 
       yield return ...create and configure monitor... 
      } 
     } 
    } 
} 

Điều này xác định nơi bạn chuyển cấu hình thành các phiên bản thực tế, chỉ bằng một nửa câu hỏi của bạn. Tôi nghĩ cú pháp XML mà bạn có để thiết lập các đối số constructor và các thuộc tính là tốt. Bạn có thể thu thập một số ý tưởng về API và triển khai từ Autofac's XML configuration system.

Thực sự, những gì bạn đang làm là sở trường của các thùng chứa IoC; bạn có thể xem xét tận dụng một trong số đó.