Создание ключа кеширования на основе имени метода и значений аргументов

Я решил реализовать фасад кэширования в одном из наших приложений - цель состоит в том, чтобы в конечном итоге уменьшить накладные расходы сети и ограничить количество обращений к базе данных. Мы используем Castle.Windsor в качестве нашего контейнера IoC , и мы решили использовать перехватчики , чтобы добавить функциональность кэширования поверх уровня наших сервисов с помощью пространство имен System.Runtime.Caching .

На данный момент я не могу точно понять, как лучше всего построить ключ кэша .Цель состоит в том, чтобы провести различие между разными методами, а также включить переданные значения аргументов - это означает, что эти два вызова методов должны быть кэшированы под двумя разными ключами:

IEnumerable<MyObject> GetMyObjectByParam(56); // key1
IEnumerable<MyObject> GetMyObjectByParam(23); // key2

На данный момент я вижу две возможные реализации:

Вариант 1: сборка | класс | тип возвращаемого значения | имя метода | типы аргументов | хэш-коды аргументов

"MyAssembly.MyClass IEnumerable<MyObject> GetMyObjectByParam(long) { 56 }";

Вариант 2: MD5 или SHA-256 вычислил хэш на основе полного имени метода и переданных значений аргументов

string key = new SHA256Managed().ComputeHash(name + args).ToString();

Я думаю о первом варианте, поскольку второй требует больше времени на обработку - с другой стороны, второй вариант обеспечивает точно такую ​​же «длину» всех сгенерированных ключей.

Можно ли предположить, что первый вариант сгенерирует уникальный ключ для методов, использующих сложные типы аргументов? Или, может быть, есть совершенно другой способ сделать это?

Мы будем очень благодарны за помощь и мнение!

8
задан MonkeyCoder 7 January 2012 в 13:44
поделиться