我目前有一个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对于特定乘客来说始终是唯一的。
我的问题是,如果通过Id或Url获取,我将存储Passenger对象的重复项,因为Cache键将不同。当我通过Id获取数据时,我使用依赖于PassengerId的密钥将其存储在缓存中,因此我无法检查是否已为特定Url存储了Passenger对象。这适用于另一种方式,如果通过Url获取,如果特定Id存在Passenger对象,则无法检入缓存。我的问题是:
如果通过Url或Id获取,仅在缓存中存储一个Passenger对象实例的最佳方法是什么?我想也许可以创建一个缓存包装器,然后在通过Url获取时,也许一旦我获得了Passenger数据,我就通过Id将Passenger存储在缓存中,然后在缓存中为Url创建一个新密钥并存储一个字符串变量使用Passenger Id对象的keyname。 (即在乘客Url键中,我会存储对乘客Id键的引用)。
在旁注中,我将Controller / Repository类中的所有数据访问方法都视为静态 - 这是一种高性能的内存吗?
我将缓存放在正确的位置吗?大多数人将它放在存储库类中,或者控制器是否可以放置它?
非常感谢任何建议!
干杯, 甲
答案 0 :(得分:0)
如果您提供有关系统的更多信息,我们可能会更有帮助。例如,您将拥有多少乘客?你的服务器有多强大等等。
但是根据给定的信息,我可以说:
您可以在找到之后将Passenger对象缓存在数组中。 然后当你想要在这个数组中进行另一次搜索时。如果在您的阵列中找不到乘客,则转到数据库,获取乘客信息,将pasenger信息添加到您的阵列并返回找到的乘客信息。
这种方式在我看来似乎不错。我们也在一些中型网站上使用它。如果某人有更好的选择,我也会感激。
答案 1 :(得分:0)
一段时间后回到这个问题。我认为这可能是一个非常主观的问题。对于它的价值,我实际上最终通过应用程序缓存中Passenger ID生成的密钥存储Passenger,例如Passenger_100。然后我在密钥中创建了一个代理对象,该代理对象将从Passenger URL(Passenger_myurl)生成,该代理对象充当对Passenger_100密钥的引用。