私は、wcf拡張機能とdynamicproxy2拡張機能によるインターセプトを使用して、njectをwcfで機能させることを試みてきました。基本的にTime属性を作成し、すべて基本的なシナリオで機能させました。問題が発生するのは、ninjectモジュールで、コンストラクター引数を使用してサービスバインディングを作成する場合です。
Bind<IMyDependency>().To<MyDependency>();
Bind<IService1>().To<Service1>().WithConstructorArgument("dependency", Kernel.Get<IMyDependency>());
すべてが正常に機能しますが、Time属性はService1またはMyDependencyの何に対しても起動しません。
時間属性は、インターネット全体に浮かぶ標準的な属性です。他の唯一のコードは、CreateKernelメソッドがglobal.asaxであり、次のようになります。
protected override IKernel CreateKernel() {
IKernel kernel = new StandardKernel(
new NinjectSettings() { LoadExtensions = false },
new WcfNinjectModule(),
new DynamicProxy2Module()
);
return kernel;
}
助けてくれてありがとう!
マット
2011年12月12日編集:リクエストに応じて、以下に詳細を追加しました。wcfninjectモジュール全体:
public class WcfNinjectModule : NinjectModule
{
public override void Load()
{
Bind<IMyDependency>().To<MyDependency>();
Bind<IService1>().To<Service1>();
}
}
global.asaxのcreatekernelメソッドは上にあり、global.asaxはNinjectWcfApplicationを継承しています。
サービス方法は次のようになります。
public class Service1 : IService1
{
private IMyDependency _dependency;
public Service1()
{
}
public Service1(IMyDependency dependency)
{
_dependency = dependency;
}
[Time]
public virtual string GetData(string value)
{
return string.Format(_dependency.GetMyString(), value);
}
}
public interface IMyDependency
{
string GetMyString();
}
public class MyDependency : IMyDependency
{
[Time]
public virtual string GetMyString()
{
return "Hello {0}";
}
}
これは役に立ちますか?
'WithConstructor'引数を削除したため、timeintercept属性はGetMyStringで起動しますが、GetDataでは起動しません。
マット