2017-10-21 14 views
1

APIプロジェクトをコードの最初の方法で記述しようとしています。コードを記述しましたが、エラーが表示されますmvc apiプロジェクトでコンストラクタを書く方法

タイプが 'CatalogController'のコントローラを作成しようとしたときにエラーが発生しました。コントローラにパラメータのないパブリックコンストラクタがあることを確認します。

タイプNop.Api.Controllers.CatalogControllerは、デフォルトコンストラクタを持っていない

コントローラ

public class CatalogController : ApiController 
{ 
    private readonly ICatalogModelFactory _catalogModelFactory; 

    public CatalogController(ICatalogModelFactory catalogModelFactory) 
    { 
     _catalogModelFactory = catalogModelFactory;   
    } 

    public HttpResponseMessage HomepageCategories() 
    { 
     HttpResponseMessage response = new HttpResponseMessage(); 
     var model = _catalogModelFactory.PrepareHomepageCategoryModels(); 

     var result = JsonConvert.SerializeObject(model); 
     response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(result) }; 

     return response; 
    } 
} 

誰がどのようにこのエラーを解決するために私を助けてくださいことはできますか?私はコンストラクターの部分で何が間違っているのかを知りません。これをデバッグするとき、ブレークポイントには当たらない。

なぜこのエラーが発生しますか?

+2

DIコンテナを使用するには[依存関係リゾルバ](https://msdn.microsoft.com/en-us/library/system.web.mvc.dependencyresolver(v = versus118).aspx)を設定していますか? – john

+0

依存性注入フレームワークを使用していますか?もしそうなら、それを設定した方法の詳細と、依存関係リゾルバの登録方法を含めることができます。そうでない場合は、これが問題です.Ninject、SimpleInjector、またはAutofac for ASP.NETのようなフレームワークを使用する方法を検索してください。 –

+0

いいえ、これはnopcommerceプロジェクトです。私はapiプロジェクトを追加する必要がありますが、エラーが表示されます。この問題を解決するのを手伝ってください – user355

答えて

1

コントローラからリソースを要求するとき、フレームワークは要求を処理する必要があります。ルーティングはコントローラやアクションなどを識別し、必要なメソッドを呼び出すためにコントローラのインスタンスをインスタンス化する必要があります。

これを実行するには、空のコンストラクタを公開するか、コンストラクタの依存関係を解決する必要があります。

あなたのケースでは、の依存関係を持つ1つのctorがあります。ICatalogModelFactoryこのlinkに見られるようなUnityContainerカスタム依存リゾルバの

DependencyResolver.SetResolver(new MyDependencyResolver()); 

ここだと例:フレームワークは、Dependency Resolverを実装し、あなたに新しい、このようなアプリケーションが起動する(Global.asaxのは)リゾルバを登録していただく必要があります

IUnityContainer container = GetUnityContainer(); 
DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

B:

public class UnityDependencyResolver : IDependencyResolver 
{   
    IUnityContainer container;  
    public UnityDependencyResolver(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return container.Resolve(serviceType); 
     } 
     catch 
     {    
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return container.ResolveAll(serviceType); 
     } 
     catch 
     {     
      return new List<object>(); 
     } 
    } 
} 

と登録は、Global.asaxのApplication_Startメソッドで発生しましたそうする別の方法は、ControllerFactoryを作成し、コントローラをDIコンテナで解決するだけです。私は、コントローラを解決するために依存性リゾルバを使うことを好む。

+0

ここで私はMyDependencyResolverを設定する必要があります。私はこの依存関係とAPIを初めて使用しています。だから私はこれを書くことに多くの知識を持っていません。 – user355

+0

アプリケーションにDIコンテナがありますか? –

+0

いいえDIには多くのレイヤがありますが、ここで私の唯一の問題は、どのようにしてコンストラクタの問題を修正できますか? – user355

関連する問題