2

私は、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では起動しません。

マット

4

1 に答える 1

0

もう少し作業を行った後(そして最後の投稿編集を書いた後)、WithConstructorArgumentメソッドを削除するだけで問題が解決し、すべてが正常に機能しているように見えることがわかりました。

マット

于 2011-12-12T09:38:31.273 に答える