我有一个在 .NET 4.6.1 Framework 上运行的 ASP.Net MVC 项目。我最近为依赖注入添加了Unity.Mvc 5 IoC框架
为了具有单元测试和其他方面的灵活性,我将我的 Unity 配置移动到一个单独的类库中,以便我可以根据需要从单元测试项目和其他项目中调用 Unity Register 方法。
这是我的高级解决方案设计。
我想使用相同的类库来实现应用程序缓存。
当我从 nuget 包安装Unity.Mvc5时,它添加了以下引用(我手动添加了其中一些):
- Microsoft.Practices.EnterpriseLibrary.Caching 5.0.505.0
- 企业库共享库 5.0.505.0
- Microsoft.Practices.ServiceLocation 1.3.0.0
- Microsoft.Practices.Unity 4.0.0.0
- Microsoft.Practices.Unity.Configuration 4.0.0.0
- Microsoft.Practices.Unity.Interception 2.1.505.0
- Microsoft.Practices.Unity.Interception.Configuration 2.1.505.0
- Microsoft.Practices.Unity.RegistrationByConvention 4.0.0.0
我尝试了几篇文章来实现应用程序块缓存管理,以便我可以在我的服务实现层中缓存数据,但是所有这些文档都显示了需要 Unity 2.xxx 版本的代码示例。
这是我的统一配置
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<UserManager<User>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<User>, UserStore<User>>(new HierarchicalLifetimeManager());
container.RegisterType<DbContext, OfficeGxDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IAppSetting, AppSettingService>();
container.RegisterType<ISubscription, SubscriptionService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
在我AppSettingService.cs
的所有方法中
public List<AppSetting> All()
{
using (var context = new MyDbContext())
{
//CachecKeyItem.AppSettingsAll
return context.AppSettings.Where(x => !x.IsDeleted)
.Include(x => x.Module).ToList();
}
}
我想将此数据存储在缓存中并重用它。同样,在我的解决方案中的所有项目中执行此操作,如果有任何update
或add
或delete
任何DB records
,我希望cached object to refresh it
缓存对象始终与数据库数据同步
我最终做了这样的事情
public interface ICacheService
{
T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class;
}
服务实施者
public class InMemoryCache : ICacheService
{
public T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class
{
if (MemoryCache.Default.Get(cacheKey) is T item) return item;
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(8));
return item;
}
}
像这样使用
_cacheService.GetOrSet(CachecKeyItem.AppSettingsAll, () => context.AppSettings
.Where(x => !x.IsDeleted)
.Include(x => x.Module).ToList());
现在我的问题是,当数据发生任何更改时,例如添加/编辑/删除,我如何以最有效的方式刷新缓存?我知道删除密钥将是一个,有更好的方法吗?