【发布时间】:2010-01-21 10:54:50
【问题描述】:
我目前有一个 LINQ 2 SQL 数据模型和一个支持“乘客”存储库类。存储库如下(在我的脑海中,所以代码可能有错误):
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 对于特定乘客来说始终是唯一的。
我的问题是,如果通过 Id 或 Url 获取,我将存储乘客对象的副本,因为缓存键会不同。当我按 Id 获取数据时,我将其存储在缓存中,其中的键取决于PassengerId,因此我无法检查该Passenger 对象是否已为特定Url 存储。这适用于另一种方式,如果通过 Url 获取,如果特定 Id 的乘客对象存在,我无法检查缓存。我的问题是:
如果通过 Url 或 Id 获取,仅在缓存中存储乘客对象的一个实例的最佳方法是什么?我在想也许可以创建一个缓存包装器,然后在通过 Url 获取时,也许一旦我得到了乘客数据,我将按 Id 将乘客存储在缓存中,然后在缓存中为 Url 创建一个新键并存储一个字符串变量带有乘客 ID 对象的键名。 (即在乘客 URL 键中,我将存储对乘客 ID 键的引用)。
附带说明一下,我将 Controller/Repository 类中的所有数据访问方法都设置为静态的 - 这是否具有高性能和高效的内存?
我是否将缓存放置在正确的位置?大多数人是把它放在存储库类中还是控制器是一个可以接受的地方?
任何建议将不胜感激!
干杯, A.
【问题讨论】:
标签: asp.net linq-to-sql caching