使用ninject和存储库,在mvc 5 ef 6中

时间:2016-05-27 16:53:48

标签: asp.net asp.net-mvc ninject

我用ninject建立了我的第一个mvc项目,我不确定我是否完全理解这一点。我有以下简单的设置。 我使用实体框架6作为我的orm。

客户存储库

 public class CustomerRepository : ICustomerRepository
 {
    private readonly ApplicationDbContext db;

    public CustomerRepository(ApplicationDbContext db)
    {
        this.db = db;
    }

    public IEnumerable<Customer> GetAll()
    {
        return this.db.Customers.ToList();
    }

}

ICustomerRepository

  public interface ICustomerRepository
  {
    IEnumerable<Customer> GetAll();
  }

Ninject

   private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ICustomerRepository>().To<CustomerRepository>().InRequestScope();
        kernel.Bind<ICustomerDetailsRepository>().To<CustomerDetailsRepository>().InRequestScope();

        kernel.Bind<ApplicationDbContext>().To<ApplicationDbContext>().InRequestScope();
    }

控制器

 public HomeController(ICustomerRepository customerRepository, ICustomerDetailsRepository customerDetailsRepository)
    {
        this.customerRepository = customerRepository;
        this.customerDetailsRepository = customerDetailsRepository;

    }

如您所见,我从同一个控制器调用两个存储库。两个存储库的设置方式完全相同。 我的存储库在请求时是否会使用相同的dbcontext,之后会自动处理吗?

这不是现实生活中的设置。我试着理解ninject是如何工作的,这是非常基础的。

1 个答案:

答案 0 :(得分:1)

您将绑定配置为InRequestScope这一事实意味着在新请求启动后第一次解析请求的对象时,以及同一请求中同一对象的每个后续解析,你将获得相同的实例。

请记住,请求的生命周期由HttpContext.Current对象的生命周期决定。

仅供参考:

正如您所见here

  • InThreadScope将您对象的生命周期与System.Threading.Thread.CurrentThread
  • 的生命周期相匹配
  • InSingletonScope将您对象的生命周期与Ninject Kernel
  • 的生命周期相匹配
  • InTransientScope将您对象的生命周期与null
  • 的生命周期相匹配

更新

关于您对实施Dispose()的人的评论: 即使你没有手动处理对象,当依赖注入容器处理你的对象时,如果它实现了dispose

,它会调用IDisposable方法。