2015-07-14 6 views
0

Для добавления и извлечения объектов из кэш-памяти У меня есть класс кэш UTIL с этими методами:Общий аргумент в динамическом прокси-перехватчик

public static T GetNativeItem<T>(string itemKey) 
public static void AddNativeItem(string key, object item, TimeSpan timeout) 

удалить некоторый шум от класса доступа к данным, я хотел бы использовать Castle Dynamic Proxy, в в этом конкретном случае я бы использовал Ninject.Extensions.Interception.

Проблема заключается в использовании GetNativeItem<T>(string itemKey) кэша, в моем перехватчике, как я могу получить T от invocation?

NinjectWebCommon связывания:

kernel.Bind<IMatchDataAccess>().To<MatchDataAccess>().Intercept().With<CacheInterceptor>(); 

Интерфейс IMatchDataAccess есть эта подпись:

public interface IMatchDataAccess 
{ 
    [Cached(minutes: 10)] 
    IEnumerable<DomainModel.Match> GetMatches(MatchFilterDto matchFilter); 
} 

и CacheInterceptor имеют эту реализацию:

public class CacheInterceptor : IInterceptor 
    { 
    public void Intercept(IInvocation invocation) 
    { 
     var cachedAttr = invocation.Request.Method.GetAttribute<CachedAttribute>(); 

     var p = invocation; 
     if (cachedAttr == null) 
     { 
     invocation.Proceed(); 
     return; 
     } 

     var cacheKey = String.Concat(invocation.Request.Method.ReturnType.ToString(), ".", invocation.Request.Method.Name, "(", String.Join(", ", invocation.Request.Arguments), ")"); 

     /* 
      problem is here 
     */ 
     var p = invocation.Request.Method.ReturnType; 
     var objInCache = CacheUtil.GetNativeItem<p>(cacheKey); 


     if (objInCache != null) 
     invocation.ReturnValue = objInCache; 

     else 
     { 
     invocation.Proceed(); 
     var timeout = cachedAttr.Minutes > 0 ? new TimeSpan(0, cachedAttr.Minutes, 0) : new TimeSpan(0, 60, 0); 
     CacheUtil.AddNativeItem(cacheKey, invocation.ReturnValue, timeout); 
     } 
    } 
    } 

ответ

0

После некоторой предварительной I found the solution here, с помощью отражения :

var method = typeof(CacheUtil).GetMethod("GetNativeItem"); 
     var gMethod = method.MakeGenericMethod(invocation.Request.Method.ReturnType); 

     var objInCache = gMethod.Invoke(typeof(CacheUtil), BindingFlags.Static, null, new object[] { cacheKey }, CultureInfo.InvariantCulture);