依赖注入听起来就像你在这里所追求的。我的偏好是 ninject,所以下面是我如何使用 EF 执行此操作的一个示例。
安装 Ninject.MVC3(在 nuget 上可用)
转到\app_start\NinjectWebCommon.cs(由上面的包添加)并将以下内容添加到RegisterServices方法中
kernel.Bind<MyContext>().ToSelf().InRequestScope(); //binding in the context in request scope, this will let us use it in our controllers
在控制器内部使用上下文如下
public class MyController : ....{
private readonly MyContext _context;
public MyController(MyContext context){ _context = context; }
//Do stuff with _context in your actions
}
这是一个非常简单的示例,您可以尝试随着应用程序的增长(例如 ninject 模块)有很多更好的方法来构建它,但这将展示 DI 的工作原理。
需要注意的几件事,始终确保在 requestscope 中绑定上下文(或更频繁地),因为 DBContext 有一个讨厌的习惯,如果它停留太久,它会增长很多。
在与您也可以注入的外部内容共享方面,例如
public class MyExternalLogic{
public MyExternalLogic(MyContext context){....}
}
public class MyController : ....{
private readonly MyContext _context;
public MyController(MyContext context, MyExternalLogic logic){ _context = context; ...}
//Do stuff with _context in your actions
}
在上面,相同的 DbContext 实例将用于 MyController 和 MyExternalLogic。Ninject 将处理这两个对象的创建。
还有许多其他可用的 DI 容器可以为您提供非常相似的体验。我强烈推荐 DI,因为它对单元测试能力也有很大帮助。
有关我如何使用 Ninject 构建 MVC 应用程序的更多示例,请查看我在 github 上的一些项目,例如https://github.com/lukemcgregor/StaticVoid.Blog