如何将存储在 web.config 中的值添加到 c# 中的 class 属性(来自 Web 配置文件而不是资源文件)
How can I add a value that is stored in web.config to a class attribute in c#(from web config file not the resource file)
public static class trial
{
public static string LUIS_MODEL_ID=ConfigurationManager.AppSettings["ID"];
public static string LUIS_SUBSCRIPTION_KEY =ConfigurationManager.AppSettings["KEY"];
[LuisModel(LUIS_MODEL_ID, LUIS_SUBSCRIPTION_KEY)] // An attribute argument must be a constant expression
[Serializable]
public class DialogLuis : LuisDialog<object>
{
这是我遇到的错误:
"An attribute argument must be a constant expression"
还有其他方法可以将值从 Web.config 传递到 LuisModel 属性吗?
您可以尝试在web.config
中添加您的参数
<appSettings>
<add key="SitePath" value="http://example.com/" />
在你可以通过
获取你的参数之后
ConfigurationManager.AppSettings["SitePath"].ToString()
您可以创建一个基础 class,它将从 web.config 获取这些值并实例化 LuisDialog
:
namespace ChatBot_LUIS.Dialogs
{
[Serializable]
public class BaseLuisDialog<T> : LuisDialog<T>
{
public BaseLuisDialog() : base(GetNewService())
{
}
private static ILuisService[] GetNewService()
{
var modelId = ConfigurationManager.AppSettings.Get("LuisModelId");
var subscriptionKey = ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
var staging = Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? "false");
var luisModel = new LuisModelAttribute(modelId, subscriptionKey, staging: staging);
return new ILuisService[] { new LuisService(luisModel) };
}
}
}
然后在您的代码中,您应该为所有 Luis 对话框使用此基础 class 并完全删除 LuisModelAttribute
。
示例:
public class RootLuisDialog : BaseLuisDialog<object>
{
....
}
您还可以继承自 LuisModelAttribute:
[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Interface, AllowMultiple = true)]
public class ConfiguredLuisModelAttribute : LuisModelAttribute, ILuisModel
{
public ConfiguredLuisModelAttribute() : base(
GetModelId(),
GetSubscriptionKey(),
LuisApiVersion.V2,
staging: GetStaging()) { }
private static string GetModelId()
{
return ConfigurationManager.AppSettings.Get("LuisModelId");
}
private static string GetSubscriptionKey()
{
return ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
}
private static bool GetStaging()
{
return Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? bool.FalseString);
}
public static class trial
{
public static string LUIS_MODEL_ID=ConfigurationManager.AppSettings["ID"];
public static string LUIS_SUBSCRIPTION_KEY =ConfigurationManager.AppSettings["KEY"];
[LuisModel(LUIS_MODEL_ID, LUIS_SUBSCRIPTION_KEY)] // An attribute argument must be a constant expression
[Serializable]
public class DialogLuis : LuisDialog<object>
{
这是我遇到的错误:
"An attribute argument must be a constant expression"
还有其他方法可以将值从 Web.config 传递到 LuisModel 属性吗?
您可以尝试在web.config
中添加您的参数<appSettings>
<add key="SitePath" value="http://example.com/" />
在你可以通过
获取你的参数之后ConfigurationManager.AppSettings["SitePath"].ToString()
您可以创建一个基础 class,它将从 web.config 获取这些值并实例化 LuisDialog
:
namespace ChatBot_LUIS.Dialogs
{
[Serializable]
public class BaseLuisDialog<T> : LuisDialog<T>
{
public BaseLuisDialog() : base(GetNewService())
{
}
private static ILuisService[] GetNewService()
{
var modelId = ConfigurationManager.AppSettings.Get("LuisModelId");
var subscriptionKey = ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
var staging = Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? "false");
var luisModel = new LuisModelAttribute(modelId, subscriptionKey, staging: staging);
return new ILuisService[] { new LuisService(luisModel) };
}
}
}
然后在您的代码中,您应该为所有 Luis 对话框使用此基础 class 并完全删除 LuisModelAttribute
。
示例:
public class RootLuisDialog : BaseLuisDialog<object>
{
....
}
您还可以继承自 LuisModelAttribute:
[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Interface, AllowMultiple = true)]
public class ConfiguredLuisModelAttribute : LuisModelAttribute, ILuisModel
{
public ConfiguredLuisModelAttribute() : base(
GetModelId(),
GetSubscriptionKey(),
LuisApiVersion.V2,
staging: GetStaging()) { }
private static string GetModelId()
{
return ConfigurationManager.AppSettings.Get("LuisModelId");
}
private static string GetSubscriptionKey()
{
return ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
}
private static bool GetStaging()
{
return Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? bool.FalseString);
}