2009-02-24 85 views
4

我使用Unity爲可插拔體系結構動態地解析類型。我還使用攔截通過AOP應用業務規則驗證(使用ValidationAspects)。最後,我使用NHibernate作爲ORM來堅持域對象。在Unity下使用代理獲取實際實例使用NHibernate攔截

爲了使AOP工作,我們使用VirtualMethodInterceptor,因爲接口攔截不適用於NHibernate。我有一個超過ISession的外觀,它處理存儲庫操作的接口和實際類型之間的轉換。

要確保在圖中通過NHibernate的獲取所有對象都正確代理的AOP,我做了一個NH IInterceptor實施和推翻了Instantiate()方法,所以我可以創建的對象提供NH,而不是把它叫new()。然後,我使用Container.Resolve()來取回代理對象並注入驗證,並將其返回給NH來填充。這工作正常。

發生會話刷新時出現問題。 NHibernate會因爲它在圖形中看到的對象是代理類型而不是真實類型而感到不安。我們映射的方式(全部通過屬性,所有虛擬)NH應該能夠通過代理獲得它需要的所有值,如果我可以重寫類型檢查。

我需要知道的是:給定一個由Unity創建的透明代理對象並且啓用了攔截,是否有一種方法可以獲得對它的代理的「真實」實例的直接引用,或者b)覆蓋NH和告訴它在運行時動態地將待處理對象的對象視爲已知的映射類型?

+0

你能建立這樣一個基本的測試案例?你有沒有考慮使用NHibernate.Validator而不是這個? (http://nhforge.org/wikis/validator10/nhibernate-validator-1-0-0-documentation.aspx) – 2009-02-24 22:30:00

回答

0

我們使用攔截進行緩存。所以在我們班,實現ICallHandler我們有這樣的代碼:

public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     //... 
     var nextHandler = getNext(); 

     var realReturn = nextHandler(input, getNext); 

     var cacheRefreshingItemParameters = new CacheRefreshingItemParameters 
     { 
      InterfaceMethod = input.MethodBase, 
      InterfaceType = input.MethodBase.DeclaringType, 
      TargetType = input.Target.GetType() //remember original type 
     }; 
     _cacheProvider.Add(cacheKey, realReturn.ReturnValue, cacheRefreshingItemParameters); 

     //... 
     return (cachedReturn); 
    } 

裝進緩存UpdateCallback cacheRefreshingItemParameters然後解決原有業務:

var service = _unityContainer.Resolve(parameters.TargetType);