В настоящее время изучаются решения для кэширования распределенной памяти, такие как кэширование приложений Memcached и Microsoft AppFabric. Мне кажется, что одним из трудных препятствий в реализации распределенного кэша для приложения является определение соответствующих ключей для хэша.Определить уникальность делегата в доменах приложений для использования в хешировании для кеша распределенной памяти
Наивный подход заключается в хеш-ключах жесткого кода в вашем приложении, чтобы все экземпляры всех узлов кластера использовали один и тот же ключ для одних и тех же данных.
Немного менее наивный подход для операторов SQL select должен состоять в том, чтобы, возможно, создать MD5 в самом выражении select. Эти операторы select могут быть динамически генерированы ORM, поэтому вы не застреваете с заранее определенными ключами.
Но что делать, если вы хотите сгенерировать ключи на основе уникальности делегата в одном из ваших классов .NET? Рассмотрим следующий пример:
public class MyExpensiveObject
{
MemCachedClient client = new MemCachedClient();
public static MyExpensiveObject LoadAll()
{
MyExpensiveObject cached = client.Get<MyExpensiveObject >(Utility.GetKey<MyExpensiveObject>(LoadAllDelegate));
if(cached == null)
{
cached = LoadAllDelegate();
client.Store(Utility.GetKey<MyExpensiveObject>(LoadAllDelegate), cached);
}
return cached;
}
public static List<MyExpensiveObject> LoadAllDelegate()
{
// return a list of all MyObjects from SQL, or wherever
}
}
public static class Utility
{
public static string GetKey<TType>(Func<TType> func)
{
// How do I do this, such that each delegate returns the same Key value across application instances?
// I know this won't work, it seems to return same value within an app domain, but different app domains return different value (which I expected)
return func.GetHashCode().ToString();
}
}
Есть ли способ, чтобы однозначно идентифицировать делегата таким образом, что мы знаем, что они одно и то же, через приложение доменов? В идеале решение будет работать для анонимных функций и ламд.
Я снимаю для луны? :)
Это даст вам тот же GUID для любой анонимной функции с различной реализацией. – edgi