2008-11-05 21 views
5

Verileri izlemek/işlemek için hızlı bir proje üzerinde çalışıyorum. Esasen sadece monitörler, programlar ve işlemciler. Monitör, bir program kullanarak verileri (ftp, local, imap, pop, vb.) Kontrol eder ve bir işlemciye yeni veriler gönderir. Hepsinin arayüzleri var..config?

Her monitörün hangi zamanlamayı/işlemciyi kullandığını yapılandırmak için config kullanmanın aklı başında bir yol bulmaya çalışıyorum. Bu oldukça kolay:

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

Ne ile mücadele ediyorum karışımı içine atılmış herhangi bir eski monitör/zamanlama/işlemci yapılandırmak için en iyi yolu bu işte. Bir yandan, bir yapıcı params veya özellikleri uygulayabileceği (herhangi bir sözdizimi almak ot vermek):

public IMonitor Create(CustomConfigSection config); 

: Başka bir çözüm, bir param olarak özel yapılandırma alır her arayüzde fabrika yöntemi

<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> 

olduğunu İnsanların ikisini de kullandığını gördüm. Ne tercih edersin? Yapılandırmayı yapıcılarla eşleştirirken ticaretin herhangi bir hilesi var mı?

DI'nin bu karmaşaya uyup uymadığı konusunda biraz yırtılmışım. Sonuçta, monitör örneği başına bir bağlanma seti olurdu; bu, hangi yapılandırmanın kapsayabileceği varsayılanlar dışında anlamsızdır.

cevap

0

Bu tür bir şey yaptığımda, yapılandırmayı ayrıştırmak, yapılandırmada belirtilen türlerde nesneler oluşturmak ve bunları bir tür veri yapısına döndürmek için temel olarak fabrika olarak çalışan bir IConfigurationSectionHandler uyguladık (genellikle bir Liste veya Sözlük). Bir IConfigurationSectionHandler kullanıp kullanmadığınıza bakılmaksızın, fabrika çıkış yoludur, çünkü yapılandırma dosyasını ayrıştırma ve bir sınıftaki nesneleri (ya da her bölüm için bir tane) oluşturmayı sağlayan kodu yerelleştireceksiniz.

Ayrıca, kuruculardaki birçok parametreye sahip sınıflar üzerinde yapılandırma için basit kurucular ve özellik belirleyici/alıcıları olan sınıfları da tercih ediyorum. Bu, fabrikanın çalışmasını kolaylaştırır ve fabrika ile inşa edilen sınıf arasındaki bağlantıyı azaltır. I monitörler grubu temsil eden bir arayüz tanımlamak, sonra

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

: barındırmak için

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

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

ve bir yapılandırma bölümünü:

0

İlk olarak, monitör temsil yapılandırma öğeleri tanımlamak:

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

Ve yapılandırma filosunu okuyan bir uygulama oluşturun. 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... 
      } 
     } 
    } 
} 

Yapılandırmayı gerçek durumlara dönüştürdüğünüz budur; bu, sorunun yalnızca yarısıdır. Ben kurucu argümanları ve özellikleri ayarlamak için sahip olduğunuz XML sözdizimi iyi olduğunu düşünüyorum. Bazı API ve uygulama fikirlerini Autofac's XML configuration system'dan edinebilirsiniz.

Gerçekten de, yaptığınız şey IoC konteynerlerinin bir forte'ları; Bunlardan birini kullanmak için bakabilirsin.