将来自 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);
}
ConfigurationManager
是 System.Configuration
程序集的一部分。
如果您遇到更复杂的情况,请post提供详细信息,我会设法找出解决方案。
在我的控制台应用程序中,我在 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);
}
ConfigurationManager
是 System.Configuration
程序集的一部分。
如果您遇到更复杂的情况,请post提供详细信息,我会设法找出解决方案。