You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#两项目间隔离引用DBAbs包的可行方案咨询

解决方案分析

问题根源

静态类的所有成员属于进程级全局共享状态——不管你的解决方案里有多少个项目引用这个NuGet包,只要它们在同一个进程中运行(比如Web项目同时引用两个业务类库),就会共用同一份静态配置,这就是两个项目互相干扰的核心原因。

关于「隔离DBAbs引用」的可行性

这个方案几乎不可行:

  • .NET的CLR在加载程序集时,同一个版本的DLL只会被加载一次,不同项目引用的同一个NuGet包最终会共享同一个DLL实例,没法实现静态状态的隔离。
  • 就算强行用不同版本的DBAbs包来隔离,后续维护成本会极高(要同步更新多个版本、处理版本冲突),完全是舍本逐末的做法。

推荐方案:将DBAbs改为实例化类

这是最合理、最符合.NET设计规范的解决方案,核心思路是把全局共享的静态状态,改为每个实例独立持有的私有状态。

改造示例

原来的静态类写法:

public static class DBAbs
{
    public static string ConnectionString { get; set; }

    public static IEnumerable<T> Query<T>(string sql)
    {
        // 基于全局ConnectionString执行查询
    }
}

改为实例化类:

public class DBAbs
{
    // 每个实例独立持有连接字符串
    private readonly string _connectionString;

    // 通过构造函数注入连接字符串,确保实例初始化时就有正确配置
    public DBAbs(string connectionString)
    {
        _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
    }

    public IEnumerable<T> Query<T>(string sql)
    {
        // 基于当前实例的_connectionString执行查询
    }
}

使用方式

两个项目可以各自创建独立的实例,完全隔离配置:

  • 项目A(连接数据库1):
var dbInstanceA = new DBAbs("Server=DBServer1;Database=DBName1;...");
var dataA = dbInstanceA.Query<User>("SELECT * FROM Users");
  • 项目B(连接数据库2):
var dbInstanceB = new DBAbs("Server=DBServer2;Database=DBName2;...");
var dataB = dbInstanceB.Query<Order>("SELECT * FROM Orders");

额外优势

实例化类还能更好地适配现代.NET开发模式:

  • 可以轻松集成到依赖注入(DI)容器中,通过DI注册不同的实例供不同项目使用。
  • 更易于单元测试:可以通过构造函数注入模拟的数据库连接,无需修改全局静态状态。

内容的提问来源于stack exchange,提问作者McGee.WIll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:12:42