作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
public class CacheAttribute : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs methodInterceptionArgs)
{
if ((methodInterceptionArgs.Method.Name == CacheAspectAction.Get.ToString())
//&& (Memory.Cache[cacheKey] != null)
)
{
// methodInterceptionArgs.ReturnValue = HttpRuntime.Cache[cacheKey];
return;
}
object returnVal = methodInterceptionArgs.Invoke(methodInterceptionArgs.Arguments);
ClanCache(cacheKeyBase, cacheKey);
if (returnVal != null)
//Memory.Cache.Insert(cacheKey, returnVal, null, expirationInformation.AbsoluteExpiration, expirationInformation.SlidingExpiration);
methodInterceptionArgs.ReturnValue = returnVal;
}
}
如何从任何类(包括 PostSharp 方面)访问 ASP.NET Core 中的内存缓存?例如,我需要访问 IMemoryCache在 MethodInterceptionAspect
和 OnMethodBoundaryAspect
中。
最佳答案
我在这里假设您正在使用内置的 ASP.NET Core 依赖项注入(inject)和 IMemoryCache 实现。然而,该示例可以很容易地适应其他实现。我要选择 Global Service Locator解决方面依赖关系的方法。以下是文档页面中的修改示例。
// A helper class that resolves services using built-in ASP.NET Core service provider.
public static class AspectServiceLocator
{
private static IServiceProvider serviceProvider;
public static void Initialize(IWebHost host)
{
serviceProvider = host.Services;
}
public static Lazy<T> GetService<T>() where T : class
{
return new Lazy<T>(GetServiceImpl<T>);
}
private static T GetServiceImpl<T>()
{
if (serviceProvider == null)
throw new InvalidOperationException();
return (T) serviceProvider.GetService(typeof(T));
}
}
public class Program
{
public static void Main(string[] args)
{
IWebHost host = CreateWebHostBuilder(args).Build();
// Initialize the AspectServiceLocator during ASP.NET Core program start-up
AspectServiceLocator.Initialize(host);
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
[PSerializable]
public class CacheAttribute : MethodInterceptionAspect
{
private static Lazy<IMemoryCache> cache;
static CacheAttribute()
{
// Use AspectServiceLocator to initialize the cache service field at application run-time.
if (!PostSharpEnvironment.IsPostSharpRunning)
{
cache = AspectServiceLocator.GetService<IMemoryCache>();
}
}
public override void OnInvoke(MethodInterceptionArgs args)
{
object cacheKey = args.Method.Name;
object cachedResult;
if (cache.Value.TryGetValue(cacheKey, out cachedResult))
{
args.ReturnValue = cachedResult;
return;
}
args.Proceed();
cache.Value.Set(cacheKey, args.ReturnValue);
}
}
关于c# - PostSharp 缓存 MethodInterceptionAspect 使用 ASP.NET Core 内存缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52039937/
我有一个 MethodInterceptionAspect(PostSharp) 的实现但是当我在重写 OnInvoke 方法时,args.Method 为 null,我需要知道方法返回值类型, 有人
我需要限制一些关于许可证的功能。所以我在 postSharp 中使用 MethodInterceptionAspect 创建了一个属性并验证了我需要的字段。是否有任何其他第三方制作 aop 自定义属性
public class CacheAttribute : MethodInterceptionAspect { public override void OnInvoke(MethodInt
我是一名优秀的程序员,十分优秀!