C# Ninject Web应用程序:所有绑定都应该在RequestScope()中?

C# Ninject Web应用程序:所有绑定都应该在RequestScope()中?,c#,asp.net,asp.net-mvc,ninject,C#,Asp.net,Asp.net Mvc,Ninject,我有一个用asp.NETMVC制作的web应用程序,我正在使用Ninject绑定接口 目前,我有以下几点: // Db Context kernel.Bind<DbContext>().To<DbEntities>().InRequestScope(); // Repositories - which are using instance of DbEntities kernel.Bind<ICustomerRepository>().To<Custo

我有一个用asp.NETMVC制作的web应用程序,我正在使用Ninject绑定接口

目前,我有以下几点:

// Db Context
kernel.Bind<DbContext>().To<DbEntities>().InRequestScope();

// Repositories - which are using instance of DbEntities
kernel.Bind<ICustomerRepository>().To<CustomerRepository>();
kernel.Bind<IProductRepository>().To<ProductRepository>();

// Services - which are using instances of Repositories
kernel.Bind<ICustomerService>().To<CustomerService>();
kernel.Bind<IProductService>().To<ProductService>();
//数据库上下文
kernel.Bind().To().InRequestScope();
//存储库-使用DbEntities实例的存储库
kernel.Bind().To();
kernel.Bind().To();
//服务-使用存储库实例的服务
kernel.Bind().To();
kernel.Bind().To();
我将DbContext绑定到RequestScope中的DbEntities,因为我希望在同一web请求中使用相同的DbContext。之后,它应该处理它

但是其他绑定应该是怎样的呢?默认情况下它们是怎样的

例如,
IProductRepository
有一个
DbContext
(每个请求一个)的实例,也应该是
InRequestScope()

ipProductService
有一个
ipProductRepository


绑定应该如何才能适合web应用程序?(而且我不会让服务器的内存过载)

您可以让存储库保持原样。默认范围是,每当需要
ipProductRepository
时,就会创建一个新实例

对于MVC应用程序,您的配置正常。如果您将存储库绑定到默认的瞬态范围或请求范围中,则不会有太大的区别。正如@Mark在瞬态范围中所述,您的依赖项将作为有界对象的新实例注入,但在事务范围中,它们将在每个请求中创建一次。我更喜欢一点请求范围,如果您想(例如)在您的存储库中进行一些每请求缓存,我建议您使用它。

为什么要注入DbContext?您的目标是什么?我想在同一个web请求上使用相同的DataContext实例,以便可以使用事务作为示例。如果我在我拥有的每个服务中创建一个新的DataContext,我就不能将来自不同服务的方法封装在TransactionInjection中。injection不是控制对象范围的好方法。injection的目的是放松应用程序中对象的耦合,以简化应用程序的扩展、测试和重构。然而,在本例中,它并没有真正这样做,因为您仍然被迫使用EF DbContext,并且无法为测试目的构建假存储库。您应该查看UnitOfWork设计模式来管理您的上下文范围。@Pluc在这一点上您是对的,但我感到困惑的是EF DbContext已经实现了UnitOfWork模式。因此,我可以创建一个接口IUnitOfWork,并使DbContext实现IUnitOfWork并以这种方式注入它。这是一个很好的问题,因此重点应该主要放在存储库和应用程序服务上可以使用的不同的Ninject范围上,而不是应该为DbContext使用什么设计模式。这种讨论偏离了实际情况。我期待在评论部分进行更富有成效的讨论,但这与OP的要求完全无关!