1

Web サービス接続 (MS Dynamics CRM のインスタンス) を必要とするいくつかのコントローラーがあり、CrmServiceコントローラーがコンストラクターを介してこれを受け取るようにしたいと考えています。CRM サービスは、現在ログインしているユーザーが誰であるかに基づいたトークンを使用してセットアップする必要があります (ユーザーがアプリケーションにログインすると、CRM に対して認証され、返されたトークンをセッションに保存できます)。

Dependency Injection と Ninject を使用してこのインスタンスを提供する最善の方法がわかりません。Ninject ToMethod()Func<> が現在のリクエストの FormsAuth/Session にアクセスして (認証されている場合はトークンを取得するために) 適切なインスタンスを作成するのは少しばかげているようです。また、ユーザーが認証されていない場合にどうなるかわかりません-これらのユーザーがコントローラーにアクセスできる必要はありませんが、コントローラーは次のようなフィルター[Authorize]が実行される前にインスタンス化されるため、依存関係は常に満たされる必要があります. 私が読んだことから、 null を返すことは理想的ではなく、とにかくこれを行うには Ninject 構成を変更する必要があります。

コントローラーがまたは何かのインスタンスを取得できるのICrmServiceFactoryではないかと考えていましたが、コントローラーが直接依存する他の依存関係を持つことCrmServiceになる場合(そしてファクトリーに渡されたくない場合)、それは役に立ちません。

これを解決する方法についてのアドバイスをいただければ幸いです。

4

3 に答える 3

2

私があなたの質問を正しく理解していれば、あなたのコントローラーには依存関係がCrmServiceありCrmService、セッションに保存されているトークンが必要です。

その場合、 を注入しCrmTokenProviderCrmServiceそのクラスにプロパティを追加し、CrmService.

public class CrmService
{
    public CrmService(CrmTokenProvider tokenProvider)
    {
        this.tokenProvider = tokenProvider;
    }

    public void DoSomeWork() 
    {
        ...
        this.tokenProvider.Token;
        ...
    }
}
于 2012-08-03T09:08:06.610 に答える
2

私は通常、IPrincipal のバインドを設定します。

kernel.Bind<IPrincipal>().ToMethod(c => HttpContext.Current.User);

このアプローチで実際に問題が発生したことはありません。

于 2012-08-02T17:57:12.447 に答える
1

私はこれを次のように実装することになりました:

private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<CrmService>()
          .ToMethod(context =>
          {
            //return unauthenticated instance if user not logged in.
            if (!HttpContext.Current.User.Identity.IsAuthenticated) return new CrmService();

            return GetConnection(HttpContext.Current);

          })
          .InRequestScope();
}

private static CrmService GetConnection(HttpContext ctx)
{
   //get stuff out of session and return service
}
于 2012-08-15T12:06:47.740 に答える