0

ドメイン オブジェクト:

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(); )、インターセプトが発生しました。

(クラス内およびクラス外の) 変更を傍受するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1

0

これは、プロキシ フレームワークと ninject がプロキシを作成する方法の制限です。

メソッドに がある場合virtual、メソッドはプロキシ/インターセプトされます。ただし、を削除するvirtualと、メソッドはプロキシ/インターセプトされなくなります。

現在、別の (プロキシされた) メソッドを呼び出すプロキシされたメソッドは、プロキシされたメソッドではなく、実装を呼び出すようです。したがって、これらを傍受することはできません。

おそらく城の動的プロキシを使用しています。Krzysztof はそれについて非常に優れたチュートリアルを書いており、仮想および非仮想メソッドもカバーしています。

また、NHibernate を使用しているため、NHibernate もプロキシを作成することに注意してください。これで、新しいエンティティを作成するときに、ninject を介して作成できます。これにより、エンティティがプロキシされ、インターセプトが構成されます。ただし、永続化されたエンティティをデータベースから取得すると、NHibernate によって作成されます。また、それをプロキシし、インターセプターを配置します。しかし、ninject のプロキシについては知らないため、これらのインターセプターは追加されません。これに関して、あなたは調べたいと思うかもしれません


または、 Fody MethodDecoratorを使用してメソッドを装飾することもできます

于 2014-07-07T08:29:09.483 に答える