Динамическое чтение ресурсов из файла - PullRequest
3 голосов
/ 17 мая 2009

Я использовал файлы resx для статических строк, чтобы иметь центральное место для их изменения. Проблема в том, что я не могу изменить их после сборки и развертывания проекта.

Есть несколько строк, которые я хотел бы изменить после развертывания, без перезапуска процесса (поэтому файлы .config отсутствуют).

Можно написать код, который эффективно анализирует файл конфигурации (XML / JSON / YAML /?), Например, кэширует результат в течение X секунд или отслеживает его изменения FileSystemWatcher , но что-то подобное уже было сделано?

РЕДАКТИРОВАТЬ: используя Json.NET и указатель Рашми Пандита на CacheDependency Я написал этот класс анализа JSON, который кэширует проанализированные результаты до тех пор, пока файл не будет изменен:

public class CachingJsonParser
{
    public static CachingJsonParser Create()
    {
        return new CachingJsonParser(
            HttpContext.Current.Server,
            HttpContext.Current.Cache);
    }

    private readonly HttpServerUtility _server;
    private readonly Cache _cache;

    public CachingJsonParser(HttpServerUtility server, Cache cache)
    {
        _server = server;
        _cache = cache;
    }

    public T Parse<T>(string relativePath)
    {
        var cacheKey = "cached_json_file:" + relativePath;
        if (_cache[cacheKey] == null)
        {
            var mappedPath = _server.MapPath(relativePath);
            var json = File.ReadAllText(mappedPath);
            var result = JavaScriptConvert.DeserializeObject(json, typeof(T));
            _cache.Insert(cacheKey, result, new CacheDependency(mappedPath));
        }
        return (T)_cache[cacheKey];
    }
}

Использование

Файл JSON:

{
    "UserName": "foo",
    "Password": "qwerty"
}

Соответствующий класс данных:

class LoginData
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

Парсинг и кеширование:

var parser = CachingJsonParser.Create();
var data = parser.Parse<LoginData>("~/App_Data/login_data.json");

1 Ответ

5 голосов
/ 17 мая 2009

Вы можете использовать XML-файлы и хранить их в кэше. Вы можете использовать CacheDependency для перезагрузки кеша, когда в файл вносятся какие-либо изменения. Ссылки: CacheDependency : CacheItemUpdateCallback :

В вашем случае ваш кэш должен хранить XmlDocument в качестве значения

Edit: Это мой пример кода

protected void Page_Load(object sender, EventArgs e)
{
        XmlDocument permissionsDoc = null;

        if (Cache["Permissions"] == null)
        {
            string path = Server.MapPath("~/XML/Permissions.xml");
            permissionsDoc = new XmlDocument();
            permissionsDoc.Load(Server.MapPath("~/XML/Permissions.xml"));
            Cache.Add("Permissions", permissionsDoc,
                            new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                           Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                    CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
        }
        else
        {
            permissionsDoc = (XmlDocument)Cache["Permissions"];
        }
}

private void ReloadPermissionsCallBack(string key, object value, CacheItemRemovedReason reason)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Server.MapPath("~/XML/Permissions.xml"));
        Cache.Insert("Permissions", doc ,
                            new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                           Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                    CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...