在多个 ninject 绑定中重用 SqlConnection



TLDR:如何在 Ninject 绑定中重用或实例化新的 Sql Connection 对象? 由于 SqlConnection 未初始化,第二个绑定失败****。 我假设我不能跨多个绑定共享 sql 连接?

我有一个这种模式的 Sql 存储库:

public class SqlRepository<T> : DataConnection, IRepository<T> where T : new() {
    public SqlRepository(IDbConnection connection) : base(connection)
}

DataConnection接受IDbConnection并返回一个连接对象:

public class DataConnection : IDisposable {
    private IDbConnection _connection;
    public DataConnection(IDbConnection connection) {
        this._connection = connection;
    }
    protected IDbConnection Connection {
        get {
            if(_connection.state != ConnectionState.Open && _connection.state != ConnectionState.Connecting)
                _connection.Open();
            return _connection;
        }
    }
}

我在我的一个类的两个地方重用它,具体取决于传递的类型参数,但 sql 连接是相同的

public class WidgetsProvider {
    private readonly IRepository<Widget> _widgetsRepo;
    private readonly IRepository<Credential> _credentialRepo;
    public WidgetsProvider(IRepository<Widget> widgetsRepo, IRepository<Credential> credentialRepo) {
        _widgetsRepo = widgetsRepo;
        _credentialRepo = credentialRepo;
    }
}

这是我的绑定:

public class WidgetIocModule : Ninject.Modules.NinjectModule {
    public override void Load() {
        //get the sql connection
        var sql = new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString());
        //bind to repos
        Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", sql);
        Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", sql);
    }
}

为 SqlConnection 创建一个绑定,而不是实例化一个绑定:

Bind<SqlConnection>().ToConstant(new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString()));
Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>());
Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>());

最新更新