1

我有一个在 .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();
            }
        }

我想将此数据存储在缓存中并重用它。同样,在我的解决方案中的所有项目中执行此操作,如果有任何updateadddelete任何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());

现在我的问题是,当数据发生任何更改时,例如添加/编辑/删除,我如何以最有效的方式刷新缓存?我知道删除密钥将是一个,有更好的方法吗?

4

1 回答 1

0

这稍微取决于您是在单服务器系统还是多服务器系统中运行。如果您决定扩展您已经排序的内容,那么总是以这种方式设计多服务器通常会更好。

因此,假设当您的缓存对所有服务器无效时,您可以收到一条消息触发,那么最简单的方法是删除您的缓存键......现在这也带来了一些可以查看的优化领域。

此缓存数据是否被大量使用,在这种情况下,您可以从预取缓存中受益,您可以将更新的缓存条目发送到所有服务器或要求所有服务器请求它?它是否使用得很少,在这种情况下你真的不想重新填充,直到它请求否则你不必要地膨胀你的应用程序。

于 2017-11-05T02:25:17.710 回答