在构造函数中注入 DbContext 可以实现获取依赖注入的 DbContext。具体操作如下:

  1. 在 CustomMessageHandler 类中添加一个私有字段 _dbContext:
private readonly ApplicationDbContext _dbContext;
  1. 修改 CustomMessageHandler 构造函数,添加一个参数 dbContext:
public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false, IServiceProvider serviceProvider = null, ApplicationDbContext dbContext = null)
    : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage, serviceProvider: serviceProvider)
{
    _dbContext = dbContext ?? ServiceLocator.GetService<ApplicationDbContext>();
    //这里设置仅用于测试,实际开发可以在外部更全局的地方设置,
    //比如MessageHandler<MessageContext>.GlobalGlobalMessageContext.ExpireMinutes = 3。
    GlobalMessageContext.ExpireMinutes = 3;

    OnlyAllowEncryptMessage = false; //是否只允许接收加密消息,默认为 false
}
  1. 在 Startup.cs 文件中,注册 dbContext:
services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString('DefaultConnection')));
  1. 在 GenerateMessageHandler 委托中,将 dbContext 作为参数传递:
public static Func<Stream, PostModel, int, IServiceProvider, CustomMessageHandler> GenerateMessageHandler = (stream, postModel, maxRecordCount, serviceProvider)
    => new CustomMessageHandler(stream, postModel, maxRecordCount, false /* 是否只允许处理加密消息,以提高安全性 */, serviceProvider: serviceProvider, dbContext: serviceProvider.GetService<ApplicationDbContext>());

这样就可以在 CustomMessageHandler 中使用 dbContext 了。在需要使用 dbContext 的方法中,直接使用字段 _dbContext 即可。

在Senparc.Weixin.MP 中使用依赖注入获取 DbContext

原文地址: https://www.cveoy.top/t/topic/nEkz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录