2011-10-12 36 views
2

說我有一個具有以下結構的應用程序。從類庫中保存配置數據外部

// ASP.NET MVC (Web Project) 
// Service/Business Layer (Class Library) 
// DAL (Class Library) 

起初,我想用在DAL類庫將舉行這樣的應用程序設置的App.config文件:

<appSettings> 
    <add key="DAL-Assembly" value="DAL.LinqToSql.DataContexts"/> 
    <add key="DAL-Type" value="DAL.LinqToSql.DataContexts.MyDataContext" /> 
</appSettings> 

然後我會用一個工廠用於創建數據上下文反射

public static DataContext GetContext() 
{ 
    string assembly = ConfigurationManager.AppSettings("DAL-Assembly"); 
    string type = ConfigurationManager.AppSettings("DAL-Type"); 

    Assembly a = Assembly.Load(assembly); 
    return (DataContext)a.CreateInstance(type); 
} 

問題是,現在我明白,類庫必須使用調用應用程序的配置文件。這意味着它將在app.config或web.config的演示文稿中尋找 - 這看起來不正確。

在這種DAL情況下,保持DAL層中包含的具體DataContext規範的最佳方式是什麼,而不必在每次更改時都重建它?甚至從更廣泛的意義上說,保持DAL層外部配置的最佳方式是?

+1

對不起,但是這是自第1天以來.NET如何完成它的。它也是有意義的,因爲配置與_application_一致。不要認爲它是「表示層」。該網站是應用程序。 –

回答

2

我會嘗試保持配置分離,並實際將其注入有問題的圖層。因此,在您的DAL層中,我可能會有一個工廠類來處理特定的數據網關,並且此工廠將在其默認構造函數中使用IDataAccessConfiguration參數。然後,您可以在本地配置類中設置靜態屬性,或者在創建時將接口的本地副本傳遞到上下文中。例如:

public interface IDataAccessConfiguration 
{ 
    string Assembly { get; } 
    string Type { get; } 
} 

public sealed class DataAccessfactory 
{ 
    private IDataAccessConfiguration Config { get; set; } 

    public DataAccessfactory(IDataAccessConfiguration config) 
    { 
     this.Config = config; 
    } 

    public ISomeDataContext GetSomeDataContext() 
    { 
     return new SomeDataContext(this.Config); 
    } 
} 

public class SomeDataContext : ISomeDataContext 
{ 
    private IDataAccessConfiguration Config { get; set;} 

    public SomeDataContext(IDataAccessConfiguration config) 
    { 
     this.Config = config; 
    } 

    private DataContext GetDataContext() 
    { 
     Assembly a = Assembly.Load(this.Config.Assembly);  
     return (DataContext)a.CreateInstance(this.Config.Type); 
    } 
} 

然後,當你真正想從特定的app.config文件,你可以做到這一點的標準方式的設置,創建一個實現IDataAccessConfiguration一個具體的類,並設置其成員來自值配置文件並傳遞該類。看到這個鏈接的問題,我問到與此有關:Best way of injecting application configuration

這是你正在尋找的東西?

0

我總是爲.config文件讀取的所有值創建一個具有靜態只讀屬性的Config類。這非常有幫助,因爲它使您可以輕鬆訪問強類型值,並且如果該值設置在web.config中,或者在您的測試項目的app.config中設置,那也不是真的。

public class Config 
{ 
    public static string QueriesPath 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["QueriesPath"].ToString(); 
     } 
    } 

    public static string SearchLogConnectionString 
    { 
     get 
     { 
      return ConfigurationManager.ConnectionStrings["SearchLog"].ConnectionString; 
     } 
    } 
} 

我總是保持一個類似的Config類與依賴於設置的項目。在你的場景中,DAL和服務層可能每個都有這樣的類。我也做了一些基本的驗證形式,例如檢查缺失值並拋出適當的異常,以便應用程序儘可能快地失敗,或者返回一個合理的默認值。

要小心地爲您的配置值唯一命名,如果我知道該庫將用於其他場景,我通常會在項目名稱前面加上前綴。

+0

雖然不是一個糟糕的方法,但您也將應用程序/圖層綁定到具體的配置風格。如果你說要使用數據庫來獲取你的配置,會發生什麼?現在,您必須更改所有配置類,因爲它們默認使用配置管理器。如果一切都隱藏在接口後面,那麼只有獲得配置的最高級別必須更改,如果您使用IoC策略,則非常簡單。 – Bertie