将DBContext范围放到IService中

时间:2013-04-05 07:59:40

标签: c# .net asp.net-mvc entity-framework ninject

我有一个网络应用程序和一个Windows服务应用程序。

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

Windows应用也使用IPersonService

例如,该服务在IPersonRepo, IAddressRepo, IEmploymentRepo上有3个依赖项。

存储库的实现需要DBContext才能使用实体框架。

在Web应用程序中,我可以将DBContext注册为Bind<MyContext>().ToSelf().InRequestScope();

在Windows服务中它比较棘手。我可以离开它,所以DBContext是暂时的,但这似乎是错误的。

所以我认为我可以将服务作为确定DBContext生命周期的范围,但我完全不确定如何确保它适用于Web应用程序和Windows服务应用程序。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

如果所有3个repos都使用相同的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);

像这样,在repos之间共享相同的上下文实例。

如果存储库不了解彼此的实体(以及对这些实体的更改),您可以通过在瞬态范围内绑定(默认行为),在每个存储库中注入一个新的DbContext实例:

Bind<MyContext>().ToSelf();