在哪里实现缓存 - 类库或Windows服务

时间:2013-07-30 01:09:47

标签: c# caching windows-services

我有一个Windows服务,它使用计时器定期调用类库(在工作线程上)。此类库具有所有必需的应用程序功能,Windows服务只是一个简单的托管环境。作为执行过程的一部分,库需要调用DB并获取一堆记录。这些记录不会经常更改(想想周数),我想将它们缓存在内存中。我应该在类库还是Windows服务中实现缓存结构?

基本上我有点不确定的是,一旦Windows服务加载,然后定期调用这个类库,库运行的app域对于库的所有执行都是相同的(通过worker每隔几分钟一次。)因为如果不是这样,在库中实现缓存的目的似乎毫无意义。

有人能帮我理解吗?

3 个答案:

答案 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)

这是一个有效的设计问题,但我认为你是从错误的角度来看待它:而不是考虑应用领域和其他可能使你更难实现功能的东西,从它的角度思考它属于哪里逻辑设计的观点。

以下是一些可能影响您思考的注意事项:

  • 您的类库为其用户提供了一个特定的界面。调用类库的所有用户是否有理由坐在内存缓存层后面?如果这个问题的答案是“是”,那么缓存功能属于类库。
  • 由于类库是一个单独的实体,因此您可能希望隐藏库客户的一些实现细节,例如窗口的服务。如果服务要将数据缓存一段时间,那么服务将拥有数据不经常更改的知识。如果这是不合需要的,请将缓存功能放在类库中。
  • 如果数据的性质可能比您正在编写的特定Windows服务更频繁地更改,则缓存属于Windows服务。
  • 如果您计划在将来实现控制缓存状态的其他功能,例如强制缓存失效的方法,那么该功能属于Windows服务(尽管您也可以将其放入类中库,并让其用户明确控制其状态。)

答案 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将您的缓存系统包装到另一个类中来维护缓存的对象。

希望这有帮助。

尼科