我有一个Windows服务,它使用计时器定期调用类库(在工作线程上)。此类库具有所有必需的应用程序功能,Windows服务只是一个简单的托管环境。作为执行过程的一部分,库需要调用DB并获取一堆记录。这些记录不会经常更改(想想周数),我想将它们缓存在内存中。我应该在类库还是Windows服务中实现缓存结构?
基本上我有点不确定的是,一旦Windows服务加载,然后定期调用这个类库,库运行的app域对于库的所有执行都是相同的(通过worker每隔几分钟一次。)因为如果不是这样,在库中实现缓存的目的似乎毫无意义。
有人能帮我理解吗?
答案 0 :(得分:0)
在类似的情况下,我在库中实现了缓存(因为它是你的主要代码库),但它使它独立于主要的呼叫服务。
像这样的东西
class ServiceRun
{
private MyLibrary.LibraryContext _context;
private Timer _timer;
public ServiceRun()
{
_context = MyLibrary.Core.InitializeBaseData();
_timer = new Timer(10000);
_timer.OnTick+= ()=> MyLibrary.Core.DoAction(_context);
}
}
如果LibraryContext
关心它自己的完整性或服务,需要使用另一个计时器调用类似_context.Refresh()
的内容完全取决于您的选择,因为它几乎不依赖于存储在其中的数据。
答案 1 :(得分:0)
这是一个有效的设计问题,但我认为你是从错误的角度来看待它:而不是考虑应用领域和其他可能使你更难实现功能的东西,从它的角度思考它属于哪里逻辑设计的观点。
以下是一些可能影响您思考的注意事项:
答案 2 :(得分:0)
您的缓存方法将基于您的实施。根据您的描述,您的服务是一个简单的包装器。这个包装器调用一个(我假设通过线程)类库来完成实际的过程。
通过这种设计,我建议在类库中实现“缓存服务”。虽然库中的类正在执行然后被处理掉,但是没有理由在库中的其他类完成后,类库不能保留对缓存的引用。
就个人而言,因为类库需要缓存的对象,所以我没有看到服务需要访问这些对象的任何理由。此外,通过在类库中维护缓存,您可以“隐藏”缓存的对象。最后,另一个重要的好处是调试和bug修复将更容易。由于您可以在任何其他应用程序中运行类库,因此您不必在Windows服务中进行调试,这本身就非常具有挑战性。
我认为真正的问题是你应该使用什么样的缓存,这会对所消耗的总内存产生很大的影响。现在这是一个不同的问题。
对于缓存,您有许多实现选项。最常见的内存中缓存是使用MemoryCache
功能作为.Net框架的一部分完成的。这支持expreration策略,以及类似于ASP.Net Web实现的完整Cacheing包装。
内存缓存的MSDN:http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx
最后,在我看来,我可能会使用Singletons或通过DependencyInjection将您的缓存系统包装到另一个类中来维护缓存的对象。
希望这有帮助。
尼科