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 回答