将来自 app.config 的值从一个控制台应用程序传递到一个 class 库

pass value from app.config from one console application to one class library

在我的控制台应用程序中,我在 app.config

上有这个
 <appSettings>
    <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xx/KrM="/>
  </appSettings>

控制台应用程序执行以下操作:

 static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Press key to continue");
                Console.ReadKey();
                QueueHelper.ReceiveMessage("Empresa");
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

但是我想在不同的 class 库中隔离 Queing 方法,所以 ReceiveMessage 的实际实现在另一个 class 库中

 /// <summary>
        /// Receives a message
        /// </summary>
        /// <param name="queuName"></param>
        public static void ReceiveMessage(string queuName)
        {
            QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

            // Configure the callback options
            OnMessageOptions options = new OnMessageOptions();
            options.AutoComplete = false;
            options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

            // Callback to handle received messages
            Client.OnMessage((message) =>
            {
                try
                {
                    Empresa empresa = GetBody<Empresa>(message);
                    // Process message from queue
                    //Console.WriteLine("Body: " + );
                    Console.WriteLine("MessageID: " + message.MessageId);

                    // Remove message from queue
                    message.Complete();
                }
                catch (Exception ex)
                {
                    // Indicates a problem, unlock message in queue
                    message.Abandon();
                }
            }, options);
        }

问题是它试图从 app.config 获取连接字符串信息,该信息是该库的本地信息,而不是调用者的信息。

所以我得到一个空连接字符串。

现在,我不想在我的 class 库项目中复制应用程序设置,实现此目的的最佳方式是什么?

其中一个原因是,最后这个控制台应用程序将作为 WebJob 安装在 Azure 中,并且 Azure 有一个界面可以更改 Web 作业的 AppSettings,但不能更改 class 库。

使用反射,您也许能够从调用程序集中获取应用程序配置。

下面是示例代码

public static void ReceiveMessage(string queuName)
    {
        var assembly = Assembly.GetCallingAssembly();

        string configPath = new Uri(assembly.CodeBase).LocalPath;
        var configManager = ConfigurationManager.OpenExeConfiguration(configPath);
        var connectionString = configManager.ConnectionStrings.CurrentConfiguration.AppSettings.Settings["Microsoft.ServiceBus.ConnectionString"];


        QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

        // Configure the callback options
        OnMessageOptions options = new OnMessageOptions();
        options.AutoComplete = false;
        options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

        // Callback to handle received messages
        Client.OnMessage((message) =>
        {
            try
            {
                Empresa empresa = GetBody(message);
                // Process message from queue
                //Console.WriteLine("Body: " + );
                Console.WriteLine("MessageID: " + message.MessageId);

                // Remove message from queue
                message.Complete();
            }
            catch (Exception ex)
            {
                // Indicates a problem, unlock message in queue
                message.Abandon();
            }
        }, options);
    }

ConfigurationManagerSystem.Configuration 程序集的一部分。

如果您遇到更复杂的情况,请post提供详细信息,我会设法找出解决方案。