В настоящее время у меня есть модель данных LINQ 2 SQL и вспомогательный класс репозитория Passenger. Репозиторий выглядит следующим образом (из головы, поэтому код может содержать ошибки):
public class PassengerRepository
{
public static Passenger GetPassenger(int passengerId)
{
Passenger p = null;
// Linq to sql code to retrieve passenger by passengerId and store in 'p'
return p;
}
public static Passenger GetPassengerByUrl(string passengerUrl)
{
Passenger p = null
// Linq to sql code to retrieve passenger by passengerUrl and store in 'p'
return p;
}
}
Кроме того, у меня есть класс PassengerController:
public class PassengerController
{
public static Passenger GetPassenger(int passengerId)
{
if (Cache["Passenger_" + passengerId] != null)
return (Passenger)Cache["Passenger_" + passengerId];
Passenger p = null;
p = PassengerRepository.GetPassenger(passengerId);
Cache["Passenger_" + passengerId] = p;
return p;
}
public static Passenger GetPassenger(string passengerUrl)
{
if (Cache["PassengerUrl_" + passengerUrl] != null)
return (Passenger)Cache["PassengerUrl_" + passengerUrl];
Passenger p = null;
p = PassengerRepository.GetPassengerByUrl(passengerUrl);
Cache["PassengerUrl_" + passengerUrl] = p;
return p;
}
}
PassengerId и PassengerUrl всегда уникальны для конкретного пассажира.
Моя проблема заключается в том, что я сохраняю дубликаты объекта Passenger при выборке по Id или Url, поскольку ключи кэша будут другими. Когда я получаю данные по Id, я сохраняю их в кеше с ключом, зависящим от PassengerId, и, следовательно, я не могу проверить, был ли этот объект Passenger уже сохранен для определенного URL. Это применяется другим способом, если при выборке по Url я не могу проверить в кэше, существует ли объект Passenger для определенного идентификатора. Мои вопросы:
Каков наилучший способ хранения только одного экземпляра объекта Passenger в кэше, если выполняется выборка по URL или Id? Я подумал, может быть, создать оболочку для кэширования, а затем при извлечении с помощью Url, возможно, когда я получу данные Пассажира, я сохраню Пассажира в кеше по Id, а затем создаю новый ключ в кеше для Url и сохраню строковую переменную. с ключом для объекта Passenger Id. (то есть в ключе Url пассажира, я бы сохранил ссылку на ключ Id пассажира.)
В дополнение к этому у меня все мои методы доступа к данным в классах Controller / Repository как статические - это эффективная и эффективная память?
Я помещаю кеширование в нужное место? Большинство людей помещают это в класс репозитория, или контроллер является приемлемым местом, чтобы поместить это?
Буду признателен за любой совет!
Ура,
A.