我用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是如何工作的,这是非常基础的。
答案 0 :(得分:1)
您将绑定配置为InRequestScope
这一事实意味着在新请求启动后第一次解析请求的对象时,以及同一请求中同一对象的每个后续解析,你将获得相同的实例。
请记住,请求的生命周期由HttpContext.Current
对象的生命周期决定。
仅供参考:
正如您所见here:
InThreadScope
将您对象的生命周期与System.Threading.Thread.CurrentThread
InSingletonScope
将您对象的生命周期与Ninject Kernel
InTransientScope
将您对象的生命周期与null
关于您对实施Dispose()
的人的评论:
即使你没有手动处理对象,当依赖注入容器处理你的对象时,如果它实现了dispose
IDisposable
方法。