2013-04-05 60 views
1

我有一个Web应用程序和一个Windows服务应用程序。将DBContext范围设置为IService

Web应用程序将IPersonService注入到其MVC控制器中。

Windows应用程序还使用IPersonService

例如,该服务在IPersonRepo, IAddressRepo, IEmploymentRepo上需要3个依赖关系。

对于实体框架使用,存储库的实现需要DBContext

在一个web应用程序,我可以在作为的DbContext Bind<MyContext>().ToSelf().InRequestScope();

在窗口服务的棘手注册。我可以离开它,所以DBContext是暂时的,但这似乎是错误的。

所以我想我可以让服务成为确定DBContext的生命周期的范围,但我完全不确定我会如何去确保它能够很好地运行于Web应用程序和Windows服务应用程序。

任何帮助,将不胜感激

+0

在瞬态范围内绑定DbContext有什么问题?通过这种方式,DbContext的生命周期就像它被注入的父类一样长。 – 2013-04-05 08:41:23

+0

我认为如果你有1个请求和1个服务,那么在一个web应用程序中,为3次回购创建上下文一次。你不想为这些服务提供相同的服务吗? – Jon 2013-04-05 08:44:14

+0

将更新http://stackoverflow.com/questions/15599325/looking-for-a-ninject-scope-that-behaves-like-inrequestscope/15604758#15604758 RSN您可以创建一个插件,将自己注册为服务,但我需要在回答中显示代码 – 2013-04-05 14:10:50

回答

0

如果它是重要的是所有3次回购使用相同的DbContext例如,你可以这样做:

var context = new DbContext(...); 

Bind<IPersonRepo>().To<PersonRepo>().WithConstructorArgument("dbContext", context); 
Bind<IAddressRepo>().To<AddressRepo>().WithConstructorArgument("dbContext", context); 
Bind<IEmploymentRepo>().To<EmploymentRepo>().WithConstructorArgument("dbContext", context); 

像这种相同的上下文实例之间共享回购。

如果存储库不知道对方的实体(和改变这些实体)的,你可以简单地注入的DbContext的新实例中的每个回购,在瞬时范围(默认行为)结合:

Bind<MyContext>().ToSelf(); 
+0

它并不重要,但我认为这是InRequestScope的重点,所以我想将它移到windows服务 – Jon 2013-04-05 09:17:36

+0

我明白你的观点,但正如你已经提到的那样,请求范围仅在Web应用程序中可用(其中控制器实例由asp.net在请求的基础上)。在非web应用程序中,此范围不适用。 – 2013-04-05 09:31:40

+0

这就是为什么我想知道范围被移动到服务,所以它负责的一生,但不知道如果这是正确的 – Jon 2013-04-05 09:36:23