如何让静态类调用的DAL类获取DbContextFactory实例?
解决静态HTML Helper获取DbContextFactory的问题
静态类无法通过构造函数注入依赖,所以要从IHtmlHelper的上下文里拿到DI容器的服务提供者,进而获取所需的IDbContextFactory或直接解析DAL实例。
方法一:直接获取DbContextFactory并实例化DAL
修改你的静态HTML Helper类,从IHtmlHelper的ViewContext中获取服务提供者,再解析已注册的IDbContextFactory<MyContext>:
public static class MyHtmlExtensions { public static IHtmlContent MyHelper(this IHtmlHelper helper, /* 其他参数 */) { // 从请求上下文获取服务提供者 var serviceProvider = helper.ViewContext.HttpContext.RequestServices; // 从DI容器获取配置好的DbContextFactory实例 var dbContextFactory = serviceProvider.GetRequiredService<IDbContextFactory<MyContext>>(); // 实例化DAL类 var dal = new DALsomething(dbContextFactory); // 执行你的业务逻辑... return new HtmlString("生成的HTML内容"); } }
方法二:将DAL注册到DI,直接解析DAL实例(更推荐)
这种方式更符合依赖注入的设计思想,避免手动实例化DAL:
- 先在
Program.cs中注册DAL类:
var _ConnectionString = builder.Configuration.GetConnectionString("MyDbConnectionString"); builder.Services.AddDbContextFactory<MyContext>(x => x.UseSqlServer(_ConnectionString), ServiceLifetime.Scoped); // 注册DAL类为Scoped服务 builder.Services.AddScoped<DALsomething>();
- 修改HTML Helper直接解析DAL:
public static class MyHtmlExtensions { public static IHtmlContent MyHelper(this IHtmlHelper helper, /* 其他参数 */) { var serviceProvider = helper.ViewContext.HttpContext.RequestServices; // 直接从DI容器获取DAL实例 var dal = serviceProvider.GetRequiredService<DALsomething>(); // 执行你的业务逻辑... return new HtmlString("生成的HTML内容"); } }
注意事项
- 不要手动
new DbContextFactory<MyContext>():DI容器中已经注册了配置好连接字符串的实例,手动创建的实例会使用默认配置,导致数据库连接错误。 - 作用域问题:
RequestServices属于请求作用域,解析的Scoped服务(如DbContextFactory和DAL)会遵循正确的生命周期,无需担心资源泄漏。
内容的提问来源于stack exchange,提问作者Hayee
相关产品推荐
相关产品推荐

