2017-01-21 16 views
0

OWIN-Startupクラスを使用してそれ自体を構成する単純なアプリケーションがあります。しかし、私はそれを働かせることができません!ここに私の構成は次のとおりです。OWINベースのASP.NET WebAPIでDryIOCを使用しても動作しません

public void Configuration(IAppBuilder appBuilder) { 

    var httpConfiguration = new HttpConfiguration(); 

    httpConfiguration.Routes.MapHttpRoute(
      name: "default_api_versioned_by_areas", 
      routeTemplate: "api/{area}/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 

    var container = new Container(); 

    // registering my services. They're all good.... 

    container.WithWebApi(
     httpConfiguration, new[] {GetType().Assembly}); 
    container.RegisterWebApiControllers(
     httpConfiguration, new[] { GetType().Assembly }); 

    appBuilder.UseDryIocWebApi(httpConfiguration) 
     .UseDryIocOwinMiddleware(container); 

    appBuilder.UseWebApi(httpConfiguration); 

    // I can resolve other services: 
    var s = container.Resolve<MyOtherService>(); 

    // but I cannot resolve controllers: 
    var c = container.Resolve<ContentController>(); 
} 

あなたが見ることができるように、MyOtherServiceは解決可能です。しかし、ContentControllerではありません。また、APIをリクエストすると、次のエラーが表示されます。

An error occurred when trying to create a controller of type 'ContentController'. Make sure that the controller has a parameterless public constructor.

Google検索は役に立ちません。アプリの実行方法を理解する手助けはできますか?

UPDATE:

コントローラがで-すべて登録されていないようです。無依存関係を持つデフォルトctorを持っています - - 私はContentController解決しようとすると、私はこのエラーを取得:

// code: 
var c = container.Resolve<ContentController>(); 

// exception: 

An exception of type 'DryIoc.ContainerException' occurred in DryIoc.dll but was not handled in user code 

Additional information: Unable to resolve MyProject.Areas.Alpha.Controllers.ContentController 

Where CurrentScope: 

    and ResolutionScope: 

    and Found registrations: 

    without matching scope DefaultKey.Of(0),{ID=33, ImplType=MyProject.Areas.Alpha.Controllers.ContentController, Reuse=CurrentScopeReuse {Name="WebRequestScopeName", Lifespan=100}}} 

    without matching scope DefaultKey.Of(1),{ID=37, ImplType=MyProject.Areas.Alpha.Controllers.ContentController, Reuse=CurrentScopeReuse {Name="WebRequestScopeName", Lifespan=100}}} 
+0

これはコントローラを解決できない場合の標準エラー応答です。コントローラの依存関係の1つを解決することはできません。コントローラのすべての依存関係をIoCコンテナで解決できることを確認してください。 – Nkosi

+0

更新からのエラーは、2つのContentController登録があることを示します。加えて、要求スコープで解決されていません - エラーに一致するスコープがありません。単にテストのために 'varスコープ= container.OpenScope(Reuse.WebRequestScopeName); scope.Resolve dadhi

+0

@dadhiそこには2つの 'ContentController'登録がありました。あなたのコメントを回答として投稿してください。私は 'appBuilder.UseWebApi(httpConfiguration)'と 'appBuilder.UseDryIocWebApi(httpConfiguration)'の両方を呼び出していました。 2番目のものを削除すると問題が解決しました –

答えて

1

フレームワークは、コントローラを解決できない場合、Web APIの標準エラー応答です。コントローラの依存関係の1つを解決することはできません。例えば

ContentController

public class ContentController : ApiController { 

    public ContentController(IOtherService service) { ... } 

} 

と定義したとDependencyResovlerは、上記のエラーが表示され、その後IOtherServiceを解決する方法を知らない場合。

コントローラのすべての依存関係が登録されており、IoCコンテナによって解決できることを確認してください。

+0

デフォルトのctorにno-dependencyがある 'ContentController'を解決しようとしました。コントローラはまったく登録されていないようです。 –

+0

@ Javad_Amiry、デバッグ目的のために、コントローラを手動で登録してからそれを解決しようとすると、そのシナリオで動作することを確認してください。 – Nkosi

1

コントローラーが解決されない理由を正確に知るには、throwIfUnresolvedパラメーターをWithWebApiメソッドに渡すことがあります。デフォルトでは、コントローラの解決はWebApiインフラストラクチャのフォールバックと元の例外を呑み込まれます。

container = container.WithWeApi(config, assemblies, throwIfUnresolved: type => type.Name.EndsWith("Controller"));

関連する問題