2012-03-18 33 views
5

我有一個具有搜索功能的Web應用程序。搜索算法被編譯爲一個單獨的dll。在搜索算法的C#代碼中,我使用保存在設置文件中的字符串指向搜索索引所在的目錄。一旦搜索代碼被編譯,設置信息被合併在Search.dll.config中,它與Search.dll一起被放入bin目錄中。現在在我的web應用程序中,我將Search.dll添加到引用中。配置文件不會添加到Web應用程序中。然而,Web應用運行良好,並知道文件在哪裏。因爲在Settings.Designer裏面,如果配置文件不存在,它使用DefaultSettingValueAttribute來分配默認值。將dll的配置文件移動到調用dll的應用程序

我該如何將Search.dll.config添加到我的網絡應用程序中,以便操作員可以根據需要更改服務器上索引文件的位置?

感謝

編輯:

我試圖將配置文件添加到我的部署文件夾。但是,ASP.NET將dll放在C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root ......目錄中,並且配置文件不會被複制到那裏。所以在這一點上,我不知道如何用我的代碼包含配置文件。

感謝您的幫助。

注:

我一直在使用下面的代碼來獲取配置文件的值到應用程序。但是,這取決於dll和配置文件在同一個文件夾中,我不知道該如何完成。

var executingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
    var location = executingAssembly.Location; //C:\MyApp\bin\Debug\Search.dll 
    var config = ConfigurationManager.OpenExeConfiguration(location); 
    var sections = config.Sections; //count of this is 21 
    ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings"); 
    ConfigurationSectionCollection csc = csg.Sections; 
    ConfigurationSection cs = csc.Get("Search.Properties.Settings"); 

回答

5

最好的辦法是直接將配置添加到web項目中。 .NET並不真正以你嘗試的方式支持與庫相關的配置;這是設計。您庫的其他用戶可能需要不同的配置。將該文件標記爲應該複製到輸出文件夾的內容。

編輯:

爲此設置「構建行動」文件屬性「內容」和「複製到輸出目錄」爲「複製,如果新」。您可以使用HttpRuntime.BinDirectory來發現bin文件夾中的文件。您可能希望將此位置傳遞給您的庫,而不是讓庫假定它正在Web項目中運行。

或者,只需在web.config中嵌入你需要的配置(配置文件有一個設置,可以將設置分解爲單獨的文件)。

最後,您可以考慮將文件嵌入爲資源。

編輯:

看着你正在使用的代碼,只需將其移動到web.config中。更容易和習慣。一旦它在web.config中,只需使用ConfigurationManager.GetSection()來閱讀您的部分。

順便提一句,有一個免費的配置節設計器,可以非常容易地創建支持自定義配置節的類。看在VS擴展在線畫廊在這裏:

http://visualstudiogallery.msdn.microsoft.com/2a69f74e-83df-4eb0-8cac-cd83b451cd1d?SRC=VSIDE

+0

謝謝!如何「將文件標記爲應該複製到輸出文件夾的內容」? – Barka 2012-03-21 18:52:14

+0

謝謝!我可以將配置行移動到web.config,但我的dll如何能夠讀取web.config?看來,asp.net把它們放在不同的隨機命名文件夾中。 – Barka 2012-03-21 20:13:42

+0

編輯我的答案來處理這個問題。 – 2012-03-21 20:44:29

5

理想的方式是從DLL文件刪除配置的依賴性。一個dll被設計爲由應用程序使用,而配置屬於應用程序而不是dll。

在大多數情況下,可以擺脫取決於/通過要麼通過DI容器或通過手動撰寫使用依賴注入從配置在DLL代碼讀取的。

,如果你的搜索DLL取決於設置,請設置爲您的DLL入口點類的依賴,並與DLL的代碼假設你不知何故入口點類得到它的設置進行。

然後,您可以從您的應用程序提供的設置值,無論是網頁/窗/控制檯,並通過配置文件/數據庫/ Web服務/文件系統讀取。

示例代碼:

在DLL:

public interface ISearcherDirectorySettings 
{ 
    string[] SearchIndexPointers { get; } 
} 

public class Searcher 
{ 
    private readonly ISearcherDirectorySettings _searchDirctorySettings; 

    public Searcher(ISearcherDirectorySettings searchDirtorySettings) 
    { 
     _searchDirctorySettings = searchDirtorySettings; 
    } 

    public void SearchAlgorithm() 
    { 
     var indexes = _searchDirctorySettings.SearchIndexPointers; 
     // search code 
    } 
} 

在您的應用程序:

public class SearcherDirectorySettings : ISearcherDirectorySettings 
{ 
    private readonly string[] _pointers; 
    public SearcherDirectorySettings(string[] pointers) 
    { 
     _pointers = pointers; 
    } 

    public string[] SearchIndexPointers 
    { 
     get { return _pointers; } 
    } 
} 

public class ApplicationRootClass //Owns configuration file 
{ 
    const string FirstPointerKey = "File1"; 
    const string SecondPointerKey = "File2"; 

    private Func<string, string> _getFromConfig = key => ConfigurationManager.AppSettings[key]; 

    public ApplicationRootClass() 
    { 
     var searcherDirectorySettings = new SearcherDirectorySettings(new[] { _getFromConfig(FirstPointerKey),_getFromConfig(SecondPointerKey) }); 

     var searcher = new Searcher(searcherDirectorySettings); 
     searcher.SearchAlgorithm(); 
    } 
} 

有了這個,你可以實現 「快速失敗」。您可以在任何應用程序中使用搜索DLL,並且該應用程序負責提供設置值。

如果您最終在多個應用程序/項目中使用dll並複製設置類代碼,則需要一個實用程序組件來完成這項工作或將設置類移動到dll中,但將設置類的實例化保留給應用程序。

1

這裏是你怎麼做你想要做什麼,反對什麼,有些人認爲你應該做的:

(對不起,我在VB中工作的時刻)

說該dll被命名爲mycompany.mynamespace.dll

  1. 在你的dll項目app.config文件重命名爲mycompany.mynamespace.dll.config
  2. 在其屬性,說複製如果較新
  3. 使用此代碼(DLL中)來訪問您的設置:

    Dim appConfig = ConfigurationManager.OpenExeConfiguration(Me.GetType.Assembly.Location) 
        _WorkingDirectory = appConfig.AppSettings.Settings("WorkingDirectory").Value