Как добавить значение, хранящееся в web.config, в атрибут класса в С# (из файла веб-конфигурации, а не из файла ресурсов)

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>
    {                         

Это ошибка, которую я получаю:

«Аргумент атрибута должен быть постоянным выражением»

Есть ли другой способ передать значение из Web.config в атрибут LuisModel?


person Gp_1993    schedule 19.01.2017    source источник
comment
значения в web.config не являются константами, отсюда и ошибка...   -  person Zohar Peled    schedule 19.01.2017
comment
возможный дубликат http://stackoverflow.com/questions/14999117/asp-net-mvc4-an-attribute-argument-must-be-a-constant-expression-typeof-expre эта ссылка поможет вам?   -  person kgzdev    schedule 19.01.2017
comment
Есть ли способ получить его из файла web.config вместо файла resx, о чем говорится в той ссылке, которую вы дали. Спасибо :)   -  person Gp_1993    schedule 19.01.2017
comment
@IkramTurgunbaev Есть ли способ получить значение из самого web.config?   -  person Gp_1993    schedule 19.01.2017
comment
@Gp_1993 Gp_1993, как сказал Зохар, значения web.config не являются постоянными, поэтому вам понадобится файл ресурсов.   -  person kgzdev    schedule 19.01.2017
comment
О.....нет другого способа сделать это?? Вы уверены?   -  person Gp_1993    schedule 19.01.2017
comment
Конечно, может быть несколько способов, но один из них — файл ресурсов.   -  person kgzdev    schedule 19.01.2017
comment
После сборки я должен иметь возможность редактировать значения в этом атрибуте LuisModel... Я не могу редактировать значение файла ресурсов после сборки... но я могу редактировать значения web.config....   -  person Gp_1993    schedule 19.01.2017
comment
Возможный дубликат Передача модели и ключ подписки на LuisDialog, отличный от атрибута   -  person Ezequiel Jadib    schedule 19.01.2017


Ответы (3)


Вы можете создать базовый класс, который получит эти значения из 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) };
        }
    }
}

Затем в своем коде вы должны использовать этот базовый класс для всех ваших диалогов Луиса и полностью удалить LuisModelAttribute. Пример:

public class RootLuisDialog : BaseLuisDialog<object>
    {
    ....
    }
person SmartDev    schedule 09.06.2017

Вы также можете наследовать от 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);
    }
person martinoss    schedule 24.07.2017

Вы можете попробовать добавить свои параметры в web.config

<appSettings>
<add key="SitePath" value="http://example.com/" />

after you can get your parameter by

ConfigurationManager.AppSettings["SitePath"].ToString()
person ahmed    schedule 19.01.2017
comment
да ... Это то, что я сделал .... Но вы не можете поместить это в атрибут ... вот когда вы получаете ошибку: Аргумент атрибута должен быть постоянным выражением ..... - person Gp_1993; 19.01.2017
comment
Что я знаю, когда вам нужно получить значение атрибута из web.config, вы можете получить его по его ключу, а не по его идентификатору - person ahmed; 19.01.2017
comment
хорошо ... это я знаю :) .. именно так я и сделал ... на вкладке настроек приложения ключ указан как ID и KEY ... но когда вы помещаете это в атрибут, эта ошибка показано - person Gp_1993; 19.01.2017
comment
Вы можете создать новый класс под названием ConstanteManager и использовать его пространство имен myProject.ConstanteManager { public class ConstanteManager { public const string MyConstante = Value; - person ahmed; 19.01.2017
comment
Это невозможно... потому что опять же... это не постоянно, так как в web.config - person Gp_1993; 19.01.2017