簡體   English   中英

Ninject。 對內部set-properties的奇怪攔截

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM