我是Dependency Injection的新手,目前正在使用Ninject作为我的DI。我一直在玩ASP.Net MVC 5应用程序,并且已经阅读了" Pro ASP.NET MVC 5"。我已经按照书中关于如何设置和使用Ninject的示例进行了操作。以下是我的注册服务的代码:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ICustomerRepository>().To<CustomerRepository>();
kernel.Bind<ICustomerUserDataRepository>().To<CustomerUserDataRepository>();
}
至于我的控制器,我在下面:
public class CustomerController : Controller
{
private ICustomerRepository customerRepository;
public CustomerController(ICustomerRepository customerRepo)
{
this.customerRepository = customerRepo;
}
// GET: Customer
public ActionResult Index(int Id = 0)
{
Customer customer = customerRepository.GetCustomer(Id).First();
return View(customer);
}
}
这正如预期的那样正常。但是,我一直在玩一些其他代码,并希望进一步使用Ninject来解决一些依赖关系。例如,我正在为我的一个Razor视图开发一个自定义帮助器。在我的帮助程序代码中,我有以下内容:
using (IKernel kernel = new StandardKernel())
{
ICustomerUserDataRepository customerUserDataRepo = kernel.Get<ICustomerUserDataRepository>();
当我运行它时,它抱怨没有为ICustomerUserDataRepository定义绑定。我假设这是因为我使用的是没有定义绑定的新内核。我读到你需要通过模块在内核中加载绑定。所以我做了以下几点:
public class MyBindings : NinjectModule
{
public override void Load()
{
Bind<ICustomerUserDataRepository>().To<CustomerUserDataRepository>();
}
}
然后我在下面设置我的内核时加载模块:
using (IKernel kernel = new StandardKernel(new MyBindings()))
{
ICustomerUserDataRepository customerUserDataRepo = kernel.Get<ICustomerUserDataRepository>();
然而,这会导致加载Ninject组件ICache&#34;错误执行应用程序时出现错误消息。我会感谢你帮助我做错了什么以及我不理解什么。我读到多个定义的内核可能导致此错误。我是不是在我的帮助方法中使用新内核,因为已经在RegisterServices()下使用和绑定了一个新内核?如果是这样,我想在我的帮助方法中访问现有内核吗?或者我是否在正确的轨道上并且需要在我的模块中加载特定绑定的新内核?谢谢。
答案 0 :(得分:0)
我是不是在我的帮助方法中使用新内核,因为已经在RegisterServices()下使用和绑定了一个新内核?
正确。您只需要每个应用程序一个内核或组合根。我建议你不要试图在辅助方法中访问依赖项,而是在Controller中创建一个viewmodel(可以访问依赖项),然后将viewmodel传递给你的helper方法。