1

コントローラーに空のデフォルト コンストラクターがないと ninject が機能しないという問題に遭遇しました。次のように、 app_start の NinjectWebCommon.cs にバインドして登録します。

 private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IServices.IAccountProvider>().To<Providers.Account.Service.AccountProvider>();
            kernel.Bind<IServices.IContractProvider>().To<Providers.Contract.ContractProvider>();
            kernel.Bind<IServices.IProductProvider>().To<Providers.Product.ProductProvider>();
            kernel.Bind<IServices.IChannelProvider>().To<Providers.Channel.ChannelProvider>();
            kernel.Bind<IServices.ITaskProvider>().To<Providers.Task.TaskProvider>();
            kernel.Bind<IServices.IExportProvider>().To<Providers.Export.ExportProvider>();
            kernel.Bind<IServices.IImportProvider>().To<Providers.Import.ImportProvider>();
            kernel.Bind<IServices.IQuoteProvider>().To<Providers.Quote.QuoteProvider>();
            kernel.Bind<IServices.IEmailProvider>().To<Providers.Email.EmailProvider>();
            kernel.Bind<IServices.IQuoteManagementProvider>().To<Providers.Quote.Management.QuoteManagementProvider>();
            kernel.Bind<IServices.IImportPricebookProvider>().To<Providers.Import.Pricebook.PricebookProvider>();
            kernel.Bind<IServices.IDashboardProvider>().To<Providers.Dashboard.DashboardProvider>();
            kernel.Bind<IServices.IAuditProvider>().To<Providers.Audit.AuditProvider>();
            }        
    }

私のコントローラーでは、次のように宣言されたプロパティがあります。

[Inject]
public IAccountProvider AccountProvider { get; set; }

しかし、これは次のような空のコンストラクターがある場合にのみ機能します。

public AccountController()
{
}

そうしないと、次のエラーが発生します。

AccountController の暗黙的な自己バインディングを使用して AccountController をアクティブ化する際のエラー 実装型のインスタンスを作成するために使用できるコンストラクターがありませんでした。

デフォルトのコンストラクターなしでこれを行う方法はありますか、それとも解決策ですか?

4

1 に答える 1

2

これについて考えた上で、プロパティを介して注入するのではなく、IAccountProvider をコンストラクターのパラメーターとして注入することをお勧めします。これが依存性注入の好ましいパターンであると思います。プロパティである正当な理由がある場合、特定のアクセサー メソッドを介して機能を公開する方がよい場合があります。さらに、それはコントローラーなので、なぜそれがプロパティとして必要なのか、私には考えられません。

于 2013-05-09T12:41:54.193 に答える