当前位置: 首页 > 知识库问答 >
问题:

ASP. NET MVC全球数据库

柯浩壤
2023-03-14

我正在尝试将变量DB设置为全局并在任何地方使用。我的问题是我正在初始化两倍的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,并访问项目中的任何地方。我该怎么做?

共有3个答案

慕容康安
2023-03-14

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

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

在您的情况下(DB上下文),我将使用N注入DI/IoC如下:

1-为DB上下文DAL声明接口:

  public interface IModelDBContext
    {
//Your methods should go here
    }

您的混凝土等级:

公共类ModelDBContext:DbContext,IModelDBContext{//此处的方法和其他内容}

(在我的情况下是n注入,但您可以使用任何其他容器)

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
            }
    }

这是有趣和令人兴奋的部分。在应用程序中的任何位置,如果需要实现特定的DB上下文,请将其与构造函数一起注入,您可以使用它:

在您的情况下,它将是这样的:

    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

    }
金烨华
2023-03-14

把它放在另一个类中(例如,一个助手),然后像这样访问它怎么样:

private ApplicationDbContext db = null;
public ApplicationDbContext Db {
    get {
        if (db == null)
            db = new ApplicationDbContext();
        return db;
    }
}
吴浩博
2023-03-14

考虑使用依赖注入模式。对于NET中有一个Unity容器,它实现了一个轻量级的、可扩展的依赖注入容器。检查的依赖项注入容器列表。网,但它已经很旧了。

通常,依赖注入被称为控制反转(IoC)。这意味着,使用DB类的类不需要依赖于特定的DB类。相反,它们只需要一个特定的接口。实现此接口的DB类是从外部注入的,并且您的类与DB类的特定实现解耦。

从以下几个地方开始:

  • Wikipedia.org上的依赖注入
  • 为什么使用依赖注入?
  • 依赖倒置原理、控制倒置和依赖注入绝对初学者教程
  • Windows通信基础中的依赖注入
 类似资料:
  • 在所有情况下,重要的是,如果允许用户Y访问该公司,微服务本身仍然必须检查是否允许用户Y对该公司进行某种操作。因此,此用户到公司的匹配仅用于确保用户对公司有访问权限。 我并不是真的很喜欢这些方法,因为将消息放入队列(1)意味着每个服务都必须被告知一个更改。使用Zuul验证(2)也不是真正实用的,因为它应该只是一个网关。

  • 问题内容: 我该怎么做: 在全球范围内,就像在主应用程序或功能中一样,是否有任何iFrame,img src等都可以使用? Docs在解释这一点方面很差。 问题答案: 我只是阅读了您先前回答中的评论。不知道您是否找到解决方案。似乎您在寻找事物的白名单类型。最近,我发现$ sce有一个白名单功能。 摘自AngularJS文档中的$ sceDelegateProvider : 有了这个,您可以像这样在

  • 正在尝试使用asp。net和mvc。 我有一个像这样的< code>Weather类: 我用来发出< code>GET请求的方法如下所示: 我请求的 URI 返回 JSON 对象。 我想访问< code >“Weather”对象,提取属性< code>main和< code>description,并在我的< code>GetWeather中返回一个列表,其中< code>JSON对象的天气属性与

  • 如何加密列产品ID在Kendo ui网格用户看不到我的真实ID?我使用ASP. NET MVC 5。 谢谢你!

  •        在“视图”菜单栏中“视图角度”栏点击“全球视图”可以迅速切换到全球视图视角。

  •        在“视图”菜单栏中“视图角度”栏点击“全球视图”可以迅速切换到全球视图视角。