Serenity .NET 5中如何在辅助类中获取ISqlConnections的静态实例?
在Serenity .NET 5中获取ISqlConnections实例实现动态连接字符串
在Serenity .NET 5里,静态SqlConnections确实被ISqlConnections抽象取代了,目的就是为了支持多租户这类需要动态连接字符串的场景。要在辅助类里实现类似原来的功能,有两种常用方式,我给你详细说下:
推荐方式:构造函数注入ISqlConnections
这是Serenity .NET 5推荐的做法,完全符合依赖注入的设计原则,也方便后续的测试和维护。你只需要把ISqlConnections通过构造函数注入到你的辅助类中就行:
public class LoginLogHelper { private readonly ISqlConnections _sqlConnections; // 构造函数注入ISqlConnections实例 public LoginLogHelper(ISqlConnections sqlConnections) { _sqlConnections = sqlConnections; } public bool SaveLoginLog(LoginLogRow logRow) { using (var connection = _sqlConnections.NewFor<LoginLogRow>()) { // 在这里执行你的日志保存逻辑,比如插入操作 connection.Insert(logRow); return true; } } }
这种方式的好处是,Serenity会自动处理当前请求的上下文(比如租户信息),ISqlConnections会返回对应租户的数据库连接,完全不需要你手动处理动态连接字符串的切换。
兼容旧代码:使用Dependency.Resolve获取实例
如果你的辅助类是静态的,或者不想大改现有结构,也可以用Serenity提供的服务定位器来获取ISqlConnections实例:
public static class LoginLogHelper { public static bool SaveLoginLog(LoginLogRow logRow) { // 从依赖容器中解析ISqlConnections实例 var sqlConnections = Dependency.Resolve<ISqlConnections>(); using (var connection = sqlConnections.NewFor<LoginLogRow>()) { // 执行保存逻辑 connection.Insert(logRow); return true; } } }
不过要注意,这种方式虽然能快速解决问题,但不如构造注入优雅,而且在编写单元测试时需要额外配置依赖容器,所以还是优先推荐构造注入的方式。
内容的提问来源于stack exchange,提问作者rahulchawla
相关产品推荐
相关产品推荐

