2010-07-02 1 views
0

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

Есть ли способ, чтобы однозначно идентифицировать делегата таким образом, что мы знаем, что они одно и то же, через приложение доменов? В идеале решение будет работать для анонимных функций и ламд.

Я снимаю для луны? :)

ответ

-1

В настоящее время, представляется, что

func.GetType().GUID 

Единственно на функцию, но то же самое между запуском приложения последовательно (пуск -> остановка, и снова начать).

Я собираюсь двигаться вперед с этим. Пожалуйста, дайте мне знать, если я ошибаюсь в своих наблюдениях.

+0

Это даст вам тот же GUID для любой анонимной функции с различной реализацией. – edgi

Смежные вопросы