ServiceStack: пользовательские настройки приложения не используются в представлении

Я довольно хорошо лажу с ServiceStack, но столкнулся с проблемой, которую в настоящее время не могу решить. В моем методе Global.asax.cs Configure () я объявляю AppSettings на основе базы данных следующим образом:

            // Create app settings, based on dictionary settings from central database
            Dictionary<string, string> configSettings = null;
            using (var db = container.Resolve<IDbConnectionFactory>().Open())
            {
                configSettings = db.Dictionary<string, string>(db.From<ConfigSetting>());
            }
            var dicSettings = new DictionarySettings(configSettings);

            // Register app settings for injection
            container.Register<IAppSettings>(dicSettings);

Это отлично работает в коде, в который вводятся AppSettings:

public class RemoteEmailValidator : IEmailValidator
{
    public IAppSettings AppSettings { get; set; }

    public bool ValidEmail(string email)
    {
        try
        {
            if (String.IsNullOrEmpty(email) || email.Length > 256)
            {
                return false;
            }

            RestClient client = new RestClient();
            string baseURL = AppSettings.Get("MailgunAPIBaseURL", "");
            if (String.IsNullOrEmpty(baseURL))
            {
                // If we can't check email in-depth, then it's OK
                return true;
            }
            else
            {
                client.BaseUrl = new Uri(baseURL);
                client.Authenticator =
                        new HttpBasicAuthenticator(AppSettings.Get("MailgunAPIUserName", ""),
                                                   AppSettings.Get("MailgunAPIPublicKey", ""));
                RestRequest request = new RestRequest();
                request.Resource = AppSettings.Get("MailgunAPIEmailValidationResource", "");
                request.AddParameter("address", email);

                var response = client.Execute(request);
                dynamic content = DynamicJson.Deserialize(response.Content);

                return content.is_valid == "true";
            }
        }
        catch { } // Suppress any errors, because email validation is nice to have

        return true;
    }
}

Значения извлекаются из базы данных, как и следовало ожидать. Однако, когда я пытаюсь получить доступ к AppSettings из представления, значения возвращаются из web.config. Например. в моем register.cshtml:

string maxHouseholdMembers = HostContext.AppSettings.Get("MaxMembersPerHousehold", "20");

значение не менялось в зависимости от значения из базы данных, но изменялось в зависимости от обновления web.config. Итак, есть ли какая-то дополнительная конфигурация, которую мне нужно сделать, чтобы мое представление использовало пользовательские настройки AppSettings, которые я создал в методе global.asax.cs Configure ()?


person vipes    schedule 04.10.2015    source источник


Ответы (1)


Я нашел ответ, когда на самом деле публиковал вопрос. Просто нужно было добавить дополнительную строку в метод Configure ():

            // Create app settings, based on dictionary settings from central database
            Dictionary<string, string> configSettings = null;
            using (var db = container.Resolve<IDbConnectionFactory>().Open())
            {
                configSettings = db.Dictionary<string, string>(db.From<ConfigSetting>());
            }
            var dicSettings = new DictionarySettings(configSettings);
            AppSettings = dicSettings;

Последняя строка (AppSettings = dicSettings) решает проблему и отменяет стандартные AppSettings.

person vipes    schedule 04.10.2015
comment
Да, вам просто нужно установить AppHost AppSettings, вам также не нужно регистрироваться в IOC, поскольку ServiceStack зарегистрирует его, если он не существует - person mythz; 04.10.2015