MSMQを使用していたでホストWCFサービスとNInjectを使用した場合のHttpContextへの代替結合します
-
20-09-2019 - |
質問
私は、IIS 7.0でWindowsのライセンス認証サービスを使用して活性化されたバインディングのMSMQを使って片道WCFサービスを持っています。
私はので、私は典型的なHTTPのWCFサービスのために素晴らしい仕事と思われる、WCFのためのNInject拡張子を使用してきたNInjectの大ファンです。
ただし、WASアクティブサービスにそこにはHTTPパイプラインではありませんので、System.Web.HttpContext.Currentがヌルであるため、私のタイプを結合するとき、私はInRequestScopeを使用することはできません。私はそれは私が欲しいものを私に与えるWASを使用した場合の代替を見つけるのに苦労しています。 AspCompatibilityモード属性は、このいずれかのモードでは動作しません。
私はInThreadScopeがうまくいくかもしれないと思ったが、サービスは、それがで実行されているものとは別のスレッドで作成されます。
だから、基本的に私は、WCF +のためのHttpContextの同等のものを必要とする要求レベルのスコープに私のオブジェクトでした。同じようにうまくいくか、誰にも私が一緒にハックすることができ、何か上の任意のアイデアを持っていないこの世界でいくつかの静的オブジェクトはありますか?
解決
using System;
using Ninject.Activation;
namespace Ninject.Contrib.Wcf {
/// <summary>
/// Defines Scope Callbacks for WCF Context.
/// </summary>
public class NinjectWcfScopeCallbacks {
/// <summary>
/// Defines WCF Context scope.
/// </summary>
public static readonly Func<IContext, object> WcfContext =
ctx => (System.ServiceModel.OperationContext.Current != null
? System.ServiceModel.OperationContext.Current.
InstanceContext.
Extensions.Find<NinjectInstanceContext>()
: null);
/// <summary>
/// Defines WCF Web Context scope.
/// </summary>
public static readonly Func<IContext, object> WcfWebContext =
ctx => System.ServiceModel.Web.WebOperationContext.Current;
}
}
完全を期すため、これは私が上で定義されたコールバックを使用する方法です。
Bind<IHelloWorldService>()
.To<HelloWorldService>()
.InScope(NinjectWcfScopeCallbacks.WcfWebContext);
あなたは上で定義されWcfWebContext
またはWcfContext
を使用すると思いますが、あなたは「日を試して見ることができるかどうかでザ・ホストされていないWCFサービスがわからなかったので。 WebOperationContext
が動作する場合は、すべてのセットです。そうでなければ、私は物事はもう少し複雑で発見しました。あなたは上記のコードスニペットは、NinjectInstanceContext
に取り付けられている。OperationContext
クラスを使用しています注意しましょう。これはNinject 2.0の「キャッシュをし、収集」を使用してオブジェクトを決定論的に配置することを可能にするメカニズムを私が書いたクラスです。基本的には、クラスがWCFはIExtension<InstanceContext>
にほとんど何を取り付けるための構築物である実装OperationContext
です。また、このクラスは、確定処分のためのサポートを提供するものであるNinjectのINotifyWhenDisposed
インターフェイスを実装します。
/// <summary>
/// Defines a custom WCF InstanceContext extension that resolves service instances
/// using Ninject.
/// <remarks>
/// The custom InstanceContext extension provides support for deterministic disposal
/// of injected dependencies and service instances themselves by being hook into
/// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle
/// management. This allows binding object instances to the lifetime of a WCF context
/// and having them deterministically deactivated and disposed.
/// </remarks>
/// </summary>
public class NinjectInstanceContext :
IExtension<InstanceContext>, INotifyWhenDisposed {
}
Ninjectのための私のWCF拡張の残りの部分は、 1 のと同じですgithubの上。どのような基本的に行われることはWCF「活性化」チェーンに差し込まれている作成されたインスタンスプロバイダ - 私は物事を理解し、どれだけ、彼らの特定の用語を使用していませんよ。だから、アイデアは、ご使用のインスタンス・プロバイダが要求されているWCFサービスクラスのインスタンスを供給することになっているということです。我々はサービスインスタンスを生成するためにNinjectを使用します。ここで、だから、ここです。そうすることによって、我々はまた、活性化させ、任意の依存関係を注入することができます。どのようなインスタンスプロバイダは私の実装ではないことはNinjectInstanceContext
場合、インスタンスにNinjectカーネルをラップし、OperationContext
に添付しています。サービスの作成は、このWCFの拡張に委任されます。インスタンスプロバイダがサービスを解放するように指示された場合、のOperationContextに取り付けたNinjectInstanceContext
はINotifyWhenDisposed
を実装する方法によって決定論的サービスの処分(および潜在的にその依存関係)を引き起こす配置されています。
は、この議論がお役に立てば幸いです。私はあなたが興味があるならここに掲載いくつかのより具体的なコードを取得することができるかどうか私はわかります。
他のヒント
私は必ずOperationContext
は、あなたが探しているものですよ。