ASP.NET MVC全局数据库
我试图将变量DB设置为全局并在任何地方使用。 我的问题是我正在初始化数据库的两倍。 在基础控制器和属性中。 即:
public class SettingsAttribute : ActionFilterAttribute {
public ApplicationDbContext db = new ApplicationDbContext();
public override void OnActionExecuting(ActionExecutingContext filterContext) {
...
}
和
[Settings]
public class BaseController : Controller {
public ApplicationDbContext db = new ApplicationDbContext();
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) {
...
}
我想创建var db一次,并访问项目中的任何地方。 我如何做到这一点?
把它放在另一个类(例如Helper)中,然后像这样访问它:
private ApplicationDbContext db = null;
public ApplicationDbContext Db {
get {
if (db == null)
db = new ApplicationDbContext();
return db;
}
}
考虑使用依赖注入模式。 对于.NET,例如Unity容器,它实现了一个轻量级的,可扩展的依赖注入容器。 检查.NET的依赖注入容器列表,但它已经很老了。
通常,依赖注入被称为控制反转 (IoC)。 这意味着,您的类(例如使用您的数据库类)不需要依赖于特定的数据库类。 相反,他们只需要一个特定的接口。 实现此接口的DB类是从外部注入的,并且您的类与DB类的特定实现分离。
一些地方开始:
在这种情况下(和类似情况)的最佳实践是实施DI/IoC pattern
,正如@ Dawid-Ferenczy在他的回答中提到的那样。 如果您以前从未使用过它,那么在开始时就会有点抽象,但从长远来看它非常有用,特别是如果您的对象变得复杂。 您可以在线搜索文章以了解更多关于模式本身的信息。
@ Dawid-Ferenczy提到了Unity容器,但并不仅限于此,您可以使用任何您想要的容器(或者甚至可以根据需要创建自己的容器)。 我个人使用Ninject,因为它有很多支持文档,我发现很容易实现。
在你的情况下(DB上下文),我会使用Ninject
和DI/IoC
如下:
1-为您的DB上下文声明一个接口DAL:
public interface IModelDBContext
{
//Your methods should go here
}
你的具体课程:
公共类ModelDBContext:DbContext,IModelDBContext {//您的方法和其他东西在这里}
容器部分
(在我的情况Ninject,但你可以使用任何其他容器)
public class NinjectDependencyResolver : IDependencyResolver
{
//Bunch of initialization and methods
Check out this : [Using ninject in MVC][2].
//Binding piece (Very important)
private void AddBindings()
{
//Context DB Binding
kernel.Bind<IModelDBContext>().To<ModelDBContext>();
//Other binding
}
}
实施部分:
这是有趣和令人兴奋的部分。 如果您需要实现特定的数据库上下文,则可以使用构造函数注入它,并且可以使用它:
在你的情况下,它会是这样的:
Public YourConcreteClass
{
Private IModelDBContext ModelDB; //Initiate an instance that you will use .
//DI by constructor
public YourConcreteClass(IModelDBContext mDB)
{
ModelDB=mDB;
}
//in the rest of your code you call ModelDB that has access to all of the methods and attributes you might need
}
链接地址: http://www.djcxy.com/p/82251.html
下一篇: Does Dependency Injection cause extra memory consumption?