C# 在何处实现缓存-类库或Windows服务
我有一个Windows服务,它使用计时器定期调用类库(在工作线程上)。这个类库具有所有必需的应用程序功能,Windows服务只是一个简单的托管环境。作为执行的一部分,库需要调用数据库并获取一组记录。这些记录不会经常更改(想想几周),我想将它们缓存在内存中。我应该在类库或Windows服务中实现缓存结构吗 基本上,我有点不确定的是,一旦Windows服务加载,然后定期调用该类库,库运行的应用程序域是否在库的所有执行中保持不变(每隔几分钟通过一个工作线程)。因为如果不是这样,在库中实现缓存的目的似乎毫无意义C# 在何处实现缓存-类库或Windows服务,c#,caching,windows-services,C#,Caching,Windows Services,我有一个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服务(尽管您也可以将其放入类库中,并让其用户明确控制其状态)
MemoryCache
功能作为.Net framework的一部分来完成的。这支持expreration策略和类似于ASP.NETWeb实现的完全缓存包装器
用于内存缓存的MSDN:
最后,在我看来,我可能会使用Singleton或DependencyInjection将您的缓存系统包装到另一个类中,以维护缓存对象
希望这有帮助
尼科非常感谢你的回复。我再也想不到有比这更简洁的了!非常感谢您的回复,希望我能在这里标记两个回复作为答案。我肯定会遵守你和DasbLinkedlight在讨论这件事时说的话。同样,MemoryCache对我来说是新的,感谢那里的指针!