[英]Ninject. Strange intercept to inner set-properties
域對象:
TargetObject.cs
public class TargetObject
{
public virtual ChildTargetObject ChildTargetObject
{
get { return ChildTargetObjectInner; }
set { ChildTargetObjectInner = value; }
}
public virtual ChildTargetObject ChildTargetObjectInner { get; set; }
}
配置和測試:
var settings = new NinjectSettings
{
InjectNonPublic = true,
AllowNullInjection = true
};
var kernel = new StandardKernel(settings);
kernel.Bind<TargetObject>().ToSelf();
kernel.InterceptReplaceSet<TargetObject>(t => t.ChildTargetObjectInner,
(inv) =>
{
inv.Proceed(); // <= we never step here. Why?
}
);
var o = kernel.Get<TargetObject>();
o.ChildTargetObject = new ChildTargetObject();
在最后一行中,我們具有更改屬性ChildTargetObject,並且它更改了內部屬性ChildTargetObjectInner 。 但是我們沒有得到它的攔截。 為什么?
如果我刪除ChildTargetObject附近的“虛擬” 對象 ,將可以正常工作(但是由於我使用NHiber,這種解決方法是不可能的)。
如果我直接更改ChildTargetObjectInner ( 例如,o.ChildTargetObjectInner = new ChildTargetObject(); ), 則會得到攔截。
我如何截獲任何變化(課堂內和課堂外)? 謝謝。
這是代理框架和ninject創建代理的方式的局限。
如果您對該方法有一個virtual
的看法,則該方法將被代理/攔截。 但是,當您刪除virtual
,該方法將不再被代理/攔截。
現在,顯然,代理方法調用另一個(代理)方法將不會調用代理方法,而是調用實現。 所以你不能攔截這些。
您可能正在使用城堡動態代理。 Krzysztof撰寫了一篇非常不錯的教程 ,其中還涵蓋了虛擬和非虛擬方法。
另請注意,由於您正在使用NHibernate,因此NHibernate也將創建代理。 現在,當您創建一個新實體時,您可以通過ninject創建它,它將代理它並配置攔截。 但是,當您從數據庫中檢索持久實體時,它將由NHibernate創建。 它還會代理它,並將其攔截器放在上面。 但是它不知道ninject的代理,因此不會添加這些攔截器。 對此,您可能需要調查
另外,您也可以使用Fody MethodDecorator裝飾方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.