gpt4 book ai didi

deployment - 将 dll 的配置文件移动到调用 dll 的应用程序

转载 作者:行者123 更新时间:2023-12-04 17:11:50 28 4
gpt4 key购买 nike

我有一个具有搜索功能的网络应用程序。搜索算法被编译成一个单独的 dll。在搜索算法的 C# 代码中,我使用设置文件中保存的字符串来指向搜索索引所在的目录。编译搜索代码后,设置信息将包含在 Search.dll.config 中。它与 Search.dll 一起放在 bin 目录中。现在在我的 Web 应用程序中,我将 Search.dll 添加到引用中。配置文件未添加到 Web 应用程序中。但是,Web 应用程序运行良好并且知道文件在哪里。因为里面Settings.Designer它使用 DefaultSettingValueAttribute如果配置文件不存在,则分配默认值。

我如何也添加 Search.dll.config到我的网络应用程序,以便运算符(operator)可以根据需要更改服务器上索引文件的位置?

谢谢

编辑:

我试图将配置文件添加到我的部署文件夹中。但是 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");

最佳答案

理想的方法是从 DLL 中删除配置依赖项。 dll 旨在供应用程序使用,配置属于应用程序而不是 dll。

在大多数情况下,您可以通过 DI 容器或通过手动编写使用依赖注入(inject)来摆脱依赖/读取 dll 代码中的配置。

如果您的搜索 dll 依赖于设置,请将设置作为您的 dll 入口点类的依赖项并继续执行 dll 代码,假设您的入口点类以某种方式获取了它的设置。

然后,您可以从应用程序中提供设置值,无论是 web/windows/console 还是从配置文件/db/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 中,但将设置类的实例化留给应用程序。

关于deployment - 将 dll 的配置文件移动到调用 dll 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762938/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com