2013-05-09 32 views
1

我遇到了一个问题,除非在控制器中有一个空白的默认构造函数,否则ninject不会工作。我在我的app_start在NinjectWebCommon.cs绑定注册类似如下:Ninject ASP.NET MVC没有默认的构造函数

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时出错 没有构造函数可用于创建实现类型的实例。

有没有办法让我做到这一点,没有默认的构造函数,或者这是解决方案?

+2

我个人认为,将IAccountProvider作为参数注入构造函数会更好。它需要成为一个财产吗? – Crwydryn 2013-05-09 11:47:31

+0

你有没有其他的构造函数?即'私人'那些禁止包含一个默认的无参数构造函数?在其他控制器上一样? (并且obv @Crwydryn在prop setter注入滥用方面是正确的) – 2013-05-09 22:00:32

回答

2

已经想到这个问题,我建议你注入IAccountProvider如在构造函数的参数,而不是通过属性注入,我相信这是对依赖注入的首选模式。您可能有充分的理由认为它是一个属性,在这种情况下,通过特定的访问器方法公开功能可能会更好。再加上它是一个控制器,所以我无法亲自考虑为什么你需要它作为一个财产。

相关问题