0

サービスがクライアントにコールバックして、サービス層のコンポーネントによって発生したイベントを中継できるようにするために、二重チャネルを使用する WCF サービスに取り組んでいます。プロキシ クラスは、次のように定義および構築されます。

public class EvsMembershipProxy : DuplexClientBase<IMembershipProviderCallback>, IEvsMembershipProvider
{
    public EvsMembershipProxy(InstanceContext callbackInstance): base(callbackInstance)
    { 
    }
}

ASP.NET メンバーシップ システムを使用して構成されたクラスでこのクラスのインスタンスを取得する必要があるため、次のようにバインドします。

_ninjectKernal.Bind<IEvsMembershipProvider>().To<EvsMembershipProxy>();

そして、私はそれを次のように注入します:

public class EvsMembershipProvider : MembershipProvider, IMembershipProviderCallback
{
    #region "Dependencies"
    [Inject]
    public IEvsMembershipProvider MembershipProvider { get; set; }
    #endregion
}

構成されたメンバーシップ プロバイダーは、次のように Ninject によって挿入されます。

_ninjectKernal.Inject(System.Web.Security.Membership.Provider);
_ninjectKernal.Inject(System.Web.Security.Roles.Provider);

二重サービスなしで WCF サービス レイヤーを使用して注入パターンをテストしたところ、正しく動作しました。ただし、デュプレックス サービスを含めると、バインディング中に Ninject が次のエラーで失敗します。

Error activating ServiceHostBase
No matching bindings are available, and the type is not self-bindable.
Activation path:
 4) Injection of dependency ServiceHostBase into parameter host of constructor of type InstanceContext
 3) Injection of dependency InstanceContext into parameter callbackInstance of constructor of type EvsMembershipProxy
 2) Injection of dependency IEvsMembershipProvider into property MembershipProvider of type EvsMembershipProvider
 1) Request for EvsMembershipProvider

Suggestions:
 1) Ensure that you have defined a binding for ServiceHostBase.
 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
 3) Ensure you have not accidentally created more than one kernel.
 4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
 5) If you are using automatic module loading, ensure the search path and filters are correct.

したがって、この問題を解決するには、EvsMembershipProxy コンストラクターで使用される ServiceHostBase クラスのバインディングが必要になるようです。ただし、設定方法がわかりません。これまでに ServiceHostBase バインディングを解決するための最善の試みは次のとおりです。

_ninjectKernal.Bind<ServiceHostBase>().ToMethod(c => OperationContext.Current.Host);

ただし、これはバインディング中に null 参照例外で失敗します。

このインジェクションが機能するように ServiceHostBase タイプをバインドするにはどうすればよいですか?

**編集: 元のコードを単純化して、WCF 構成によって提供される可能性のある EvsMembershipProxy コンストラクター引数の一部を削除しました**

4

1 に答える 1

1

このように設定できることを発見しました。

_ninjectKernal.Bind<IEvsMembershipProvider>()
              .To<EvsMembershipProxy()
              .WithConstructorArgument("callbackInstance", Membership.Provider);

構成されたメンバーシップ プロバイダーは IMembershipProviderCallback インターフェイスを実装し、サービスからコールバックを受け取ります。

于 2014-01-22T16:21:09.860 に答える