2017-08-29 29 views
3

これまでのWep API2プロジェクトではNInjectを使用していましたが、今は奇妙な状況に苦しんでいます。NInjectは特定の依存関係を解決しません

私はコントローラに依存関係を設定するための3つのパラメータを受け取ります。コンストラクタは、次のようになります解決することがcan't

public UsersController(IUsersServices userServices, IConfigurationServices configServices, IUsersAPIProxy usersProxy) 
{ 
    this.configServices = configServices; 
    this.userServices = userServices; 
    this.usersProxy = usersProxy; 
} 

依存関係が最新のものである:IUsersAPIProxy。他の2 がコースオフ、依存関係のバインディングは、次のように定義されていると何も問題はありません。

kernel.Bind<IUsersAPIProxy>().To<UsersAPIProxy>().InRequestScope(); 
kernel.Bind<IUsersServices>().To<UsersServices>().InRequestScope(); 
kernel.Bind<IConfigurationServices>().To<ConfigurationServices>().InRequestScope(); 

IUsersAPIProxyインターフェースは非常に単純です:

public interface IUsersAPIProxy 
{ 
    UserModel ReadUser(string loginName); 
    IEnumerable<UserModel> ReadAllUsers(); 
} 

クラスUsersApiProxy」はdoesnのトンを注入する必要がある任意の依存関係を持っている:

public class UsersAPIProxy : APIProxyBase, IUsersAPIProxy 
{ 
    public IEnumerable<UserModel> ReadAllUsers() 
    { 
     var request = new RestRequest("sec/users2/");   
     IRestResponse<List<UserModel>> response = client.Execute<List<UserModel>>(request); 
     if (response.StatusCode == System.Net.HttpStatusCode.OK) 
      return response.Data; 

     throw new ApplicationException(String.Format("There was an error when trying to retrieve the users. Response content: {0}")); 
    } 

    public UserModel ReadUser(string loginName) 
    { 
     var request = new RestRequest("sec/users2/{loginName}"); 
     request.AddUrlSegment("loginName", loginName); 
     IRestResponse<UserModel> response = client.Execute<UserModel>(request); 

     if (response.StatusCode == System.Net.HttpStatusCode.OK) 
      return response.Data; 

     throw new ApplicationException(String.Format("There was an error when trying to retrieve data for user {0}. Response content: {1}", loginName, response.Content)); 
    } 
} 

その基底クラスは、どちらか特別なものではありません。

public class APIProxyBase 
{ 
    protected RestClient client = null; 

    public APIProxyBase() 
    { 
     client = new RestClient("http://myHost:MyPort/"); 
    } 
} 

コントローラのコンストラクタからIUsersAPIProxyパラメータを削除したかどうかわからないため、正常に動作します。奇妙なことは、この依存関係でのみ起こることです。パラメータを別の位置に変更すると、それは役に立ちません。また、実際に動作する他のインターフェイスやクラスははるかに複雑です。 言及する価値があることは、動作している型が動作しない型とは異なるDLLで定義されていることです。言うまでもなく、Web APIが両方のDLLを正しく参照しています。 次のように私が手に例外がある:

メッセージ:型「がUserController」のコントローラを作成しようとしたとき にエラーが発生しました。コントローラにパラメータのないパブリックコンストラクタがあることを確認します。

スタックトレース:System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Createアン (HttpRequestMessage要求、HttpControllerDescriptor controllerDescriptor、タイプcontrollerType) System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessageリクエスト) エンja System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

誰かが正しい方向を教えてくれますか?

ありがとうございます!

+1

実際のエラーダンプを掲載してください。 – JuanR

+1

また、他の2つのパラメータのNinjectバインディングも投稿してください。 – JuanR

+0

こんにちは! Actallエラーダンプは次のようになります: "タイプ 'UsersController'のコントローラを作成しようとすると、エラーが発生しました。コントローラにパラメータのないパブリックコンストラクタがあることを確認してください。 –

答えて

4

その基底クラスは、どちらか特別なものではありません:

public class APIProxyBase 
{ 
    protected RestClient client = null; 

    public APIProxyBase() 
    { 
     client = new RestClient("http://myHost:MyPort/"); 
    } 
} 

私はあなたがこのことについて間違っていると思う - ここで起こって特別な何かがあります。アプリケーションの構成フェーズ中に依存関係を新しくしています。この依存関係は、機能を発揮させるためにランタイムデータに依存することがあります(例えばHttpContext)。これはアプリケーションの起動時には利用できません。

この理論をテストするには、RestClientをインスタンス化する行にコメントを付けて、依存関係が注入されているかどうかを確認します。

public class APIProxyBase 
{ 
    protected RestClient client = null; 

    public APIProxyBase() 
    { 
     //client = new RestClient("http://myHost:MyPort/"); 
    } 
} 

Ninjectによって飲み込まれているエラーによってオブジェクトがインスタンス化できない可能性があります。

+0

それは完全に可能です。彼はまた、「RestClient」オブジェクト(例えばインタフェース)を注入することもできる。これは依存関係のチェーンと構造を視覚化するのにも役立ち、おそらくより詳細なエラーダンプをもたらすでしょう。 – JuanR

+0

優秀な男、私はそれを試してみると、できるだけ早くあなたに知らせる。ヒントをありがとう! –

+0

こんにちはNightOwI888、まさにあなたが言ったように、皆さんは私の一日を救った!ありがとう!! –

関連する問題