1

私は一定期間 Ninject 2 を使用しており、SignalR やその他のフレームワークをより適切にサポートするために Ninject 3 に更新しました。

以下のコードは正常に動作していました。

public class AttributeDrivenPlanningStrategy<TAttribute, TInterceptor> : NinjectComponent, IPlanningStrategy
        where TAttribute : Attribute
        where TInterceptor : IInterceptor
    {
        private readonly IAdviceFactory adviceFactory;
        private readonly IAdviceRegistry adviceRegistry;

        public AttributeDrivenPlanningStrategy(IAdviceFactory adviceFactory, IAdviceRegistry adviceRegistry)
        {
            this.adviceFactory = adviceFactory;
            this.adviceRegistry = adviceRegistry;
        }

        public void Execute(IPlan plan)
        {
            var methods = GetCandidateMethods(plan.Type);
            foreach (var method in methods)
            {
                if(!method.HasAttribute<TAttribute>())
                { continue; }

                var advice = adviceFactory.Create(method);
                advice.Callback = request => request.Kernel.Get<TInterceptor>();
                adviceRegistry.Register(advice);

                if (!plan.Has<ProxyDirective>()) 
                { plan.Add(new ProxyDirective()); }
            }
        }


        private static IEnumerable<MethodInfo> GetCandidateMethods(Type type)
        {
            const BindingFlags methodFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            var methods = type.GetMethods(methodFlags);
            return methods.Where(ShouldIntercept);
        }

        private static bool ShouldIntercept(MethodInfo methodInfo)
        {
            return methodInfo.DeclaringType != typeof (object) &&
                   !methodInfo.IsPrivate &&
                   !methodInfo.IsFinal;
        }
    }

ただし、ninject バインディングで IAdviceFactory を見つけることができないと言って爆発します。この拡張機能に関するドキュメントがほとんどないため、インターセプターの最新バージョンに重大な変更がありましたか?最近は AoP が浮かんでいます)。

それで、問題が何であるかを教えてくれるどこかの方向に誰かが私を向けることができますか?

4

1 に答える 1

1

これは、linfu ベースのプロキシと城ベースのプロキシのどちらかを選択できるため、ninject.interception の nuget パッケージには他のライブラリが含まれていないため、インターセプター用の dynamicproxy nuget パッケージがインストールされていないことが原因でした。

于 2013-07-17T11:51:56.390 に答える