如何将 DBContext 注入 HTTPModule

Posted

技术标签:

【中文标题】如何将 DBContext 注入 HTTPModule【英文标题】:How can I inject DBContext to HTTPModule 【发布时间】:2020-01-02 06:35:13 【问题描述】:

我在创建使用 Entity Framework 的 httpmodule 时遇到了 DBContext 的问题。 我想将DBContext 注入httpmodule,就像在constructor 中注入依赖一样。 有什么解决办法吗?

MyHTTPModule

公共类 MyHTTPModule:IHttpModule ... 公共无效 OnBeginRequest(对象发送者,EventArgs e) HttpApplication 应用程序 = (HttpApplication) 发送者; HttpContext 上下文 = Application.Context; 字符串文件路径= Context.Request.FilePath; MyDBContext db = new MyDBContext(); var file = db.file.FirstOrDefault(r => r.filename == 文件路径); ...

我想要的是将 dbcontext 注入到 httpmodule 中,例如:

公共类 MyHTTPModule:IHttpModule 私有 MyDBContext 数据库; 公共 MyHTTPModule(MyDBContext dbcontext) 分贝=分贝上下文; ... 公共无效 OnBeginRequest(对象发送者,EventArgs e) HttpApplication 应用程序 = (HttpApplication) 发送者; HttpContext 上下文 = Application.Context; 字符串文件路径= Context.Request.FilePath; var file = db.file.FirstOrDefault(r => r.filename == 文件路径); ...

【问题讨论】:

***.com/questions/1657473/… 【参考方案1】:

我使用Simple Injector 找到了解决此问题的简单方法。

安装了 3 个 NuGet 包。 (Microsoft.Web.Infrastructure, SimpleInjector, SimpleInjector.Integration.Web)

并为MyDBContext创建接口

Global.asax.cs

private static Container container;

public static Container Container

    get  return container ?? (container = RegisterAndVerifyContainer()); 


private static Container RegisterAndVerifyContainer()

    var container = new Container();
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

    container.Register<IDBContext, MyDBContext>(Lifestyle.Singleton);

    container.Verify();

    return container;

MyDBContext

public partial class MyDBContext: DbContext, IDBContext

    public MyDBContext() : base("name=MyDBContext")
    
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        throw new UnintentionalCodeFirstException();
    

    public virtual DbSet<file> file get; set; 


public interface IDBContext : IDisposable

    DbSet<file> file  get; set; 

MyHTTPModule

private IDBContext DBContext;
public MyHTTPModule()

    DBContext = Global.Container.GetInstance<IDBContext>();

【讨论】:

以上是关于如何将 DBContext 注入 HTTPModule的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core DbContext 注入

将 DbContext 与依赖注入一起使用

将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception

实体中的业务逻辑并注入 DbContext

如何使用autofac实现多个DbContext的注入

带有私有 NuGet 包的 Blazor 依赖项注入和 EF/DbContext