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类的特定实现分离。

一些地方开始:

  • 维基百科上的依赖注入
  • 为什么要使用依赖注入?
  • 一个绝对初学者的依赖倒置原理教程,控制反转和依赖注入
  • Windows Communication Foundation中的依赖注入

  • 在这种情况下(和类似情况)的最佳实践是实施DI/IoC pattern ,正如@ Dawid-Ferenczy在他的回答中提到的那样。 如果您以前从未使用过它,那么在开始时就会有点抽象,但从长远来看它非常有用,特别是如果您的对象变得复杂。 您可以在线搜索文章以了解更多关于模式本身的信息。

    @ Dawid-Ferenczy提到了Unity容器,但并不仅限于此,您可以使用任何您想要的容器(或者甚至可以根据需要创建自己的容器)。 我个人使用Ninject,因为它有很多支持文档,我发现很容易实现。

    在你的情况下(DB上下文),我会使用NinjectDI/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

    上一篇: ASP.NET MVC Global DB

    下一篇: Does Dependency Injection cause extra memory consumption?