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

时间:2015-07-08 21:12:32

标签: c# azure azure-webjobs

在我的控制台应用程序中,我在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;
            }
        }

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

 /// <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获取连接字符串信息,该信息是该库的本地而不是调用者。

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

现在,我不想在我的类库项目中复制应用程序设置,如何以及实现此目的的最佳方法是什么?

其中一个原因是,最终这个控制台应用程序将作为WebJob安装在Azure中,而Azure有一个界面可以更改Webjobs的AppSettings,但不能用于类库。

1 个答案:

答案 0 :(得分:1)

使用反射,您可以从调用程序集中获取应用程序配置。

以下是示例代码

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汇编的一部分。

如果您有更复杂的情况,请发布详细信息,我会尝试找出解决方案。