Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在何处实现缓存-类库或Windows服务_C#_Caching_Windows Services - Fatal编程技术网

C# 在何处实现缓存-类库或Windows服务

C# 在何处实现缓存-类库或Windows服务,c#,caching,windows-services,C#,Caching,Windows Services,我有一个Windows服务,它使用计时器定期调用类库(在工作线程上)。这个类库具有所有必需的应用程序功能,Windows服务只是一个简单的托管环境。作为执行的一部分,库需要调用数据库并获取一组记录。这些记录不会经常更改(想想几周),我想将它们缓存在内存中。我应该在类库或Windows服务中实现缓存结构吗 基本上,我有点不确定的是,一旦Windows服务加载,然后定期调用该类库,库运行的应用程序域是否在库的所有执行中保持不变(每隔几分钟通过一个工作线程)。因为如果不是这样,在库中实现缓存的目的似乎

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

基本上,我有点不确定的是,一旦Windows服务加载,然后定期调用该类库,库运行的应用程序域是否在库的所有执行中保持不变(每隔几分钟通过一个工作线程)。因为如果不是这样,在库中实现缓存的目的似乎毫无意义


有人能帮我理解这一点吗?

在类似的情况下,我在库中实现了缓存(因为它是您的主代码库),但使它独立于主调用服务do

像这样的

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
关心自身的完整性或服务,则需要调用类似
\u context的东西。使用另一个计时器刷新()
完全取决于您的选择,因为它几乎不依赖于其中存储的数据。

这是一个有效的设计问题,但我认为你从一个错误的角度来看待它:与其考虑应用程序域和其他可能使你难以实现功能的事情,不如从逻辑设计的角度来思考它属于什么

以下是一些可能影响您思考的因素:

  • 类库向其用户提供特定的接口。所有调用类库的用户都坐在内存缓存层后面,这有意义吗?如果这个问题的答案是“是”,那么缓存功能属于类库
  • 由于类库是一个独立的实体,因此您可能希望对库的客户隐藏一些实现细节,例如窗口的服务。如果服务要将数据缓存一段时间,那么服务将知道数据很少更改。如果不希望出现这种情况,请将缓存功能放在类库中
  • 如果数据在性质上的更改比您正在编写的特定windows服务的更改更频繁,则缓存属于windows服务
  • 如果您计划在将来实现控制缓存状态的附加功能,例如强制缓存失效的方法,那么该功能属于windows服务(尽管您也可以将其放入类库中,并让其用户明确控制其状态)

缓存方法将基于您的实现。根据上面的描述,您的服务是一个简单的包装器。这个包装器调用一个(我假设是通过线程)类库来执行实际的进程

通过这种设计,我建议在类库中实现“缓存服务”。尽管正在执行库中的类,然后将其释放,但没有理由在库中的其他类完成后,类库不能保留对缓存的引用

就个人而言,由于类库需要缓存对象,我看不出服务需要访问这些对象的任何原因。此外,通过维护类库中的缓存,可以“隐藏”缓存对象。最后,另一个积极的方面是调试和bug修复将更加容易。由于您可以在任何其他应用程序中运行类库,因此不必在windows服务中进行调试,这本身可能非常具有挑战性

我认为真正的问题是应该使用哪种缓存,这对所消耗的总内存有很大的影响。现在这是一个完全不同的问题

对于缓存,您有许多实现选项。最常见的内存缓存是使用
MemoryCache
功能作为.Net framework的一部分来完成的。这支持expreration策略和类似于ASP.NETWeb实现的完全缓存包装器

用于内存缓存的MSDN:

最后,在我看来,我可能会使用Singleton或DependencyInjection将您的缓存系统包装到另一个类中,以维护缓存对象

希望这有帮助


尼科

非常感谢你的回复。我再也想不到有比这更简洁的了!非常感谢您的回复,希望我能在这里标记两个回复作为答案。我肯定会遵守你和DasbLinkedlight在讨论这件事时说的话。同样,MemoryCache对我来说是新的,感谢那里的指针!