C# 当构造函数需要对象时,如何绑定ninject?

C# 当构造函数需要对象时,如何绑定ninject?,c#,ninject,C#,Ninject,我的工作单元对象有两个依赖项,一个连接和一个事务。事务需要连接才能绑定。不确定如何处理这种情况 public class UnitOfWork : IUnitOfWork { public IDbConnection Connection { get; set; } public IDbTransaction Transaction { get; set; } public UnitOfWork(IDbConnection connection, IDbTransact

我的工作单元对象有两个依赖项,一个连接和一个事务。事务需要连接才能绑定。不确定如何处理这种情况

public class UnitOfWork : IUnitOfWork
{
    public IDbConnection Connection { get; set; }
    public IDbTransaction Transaction { get; set; }

    public UnitOfWork(IDbConnection connection, IDbTransaction transaction)
    {
        this.Connection = connection;
        // In order to create the transaction, it needs the passed in IDbConnection.
    }

    public void Commit()
    {

    }

    public void Rollback()
    {

    }
}
我将如何处理这种情况

Bind<IDbTransaction>().To<SqlTransaction>();
Bind().To();

您可以尝试按照下面的示例进行操作

private void RegisterDependencyResolver()
        {
            var kernel = new StandardKernel();         
            var connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            kernel.Bind(typeof(DataContext)).ToMethod(context => new DataContext(connectionString));
            kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));            
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }
private void RegisterDependencyResolver()
{
var kernel=新的标准内核();
var connectionString=ConfigurationManager.connectionString[“connectionString”]。connectionString;
Bind(typeof(DataContext)).ToMethod(context=>newdatacontext(connectionString));
Bind(typeof(IRepository)).To(typeof(Repository));
SetResolver(新的NinjectDependencyResolver(内核));
}

下面是另一个相关的讨论,作为查看的附加资源-

您可以这样绑定它。以这种方式,IDB事务将绑定到IDB连接

var kernel = new StandardKernel();
kernel.Bind<IDbConnection>()
      .To<SqlConnection>()
      .WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IDbTransaction>()
      .ToMethod(x => x.Kernel.Get<IDbConnection>().BeginTransaction());
var-kernel=new-StandardKernel();
kernel.Bind()
.至()
.带有构造函数参数(“connectionString”,connectionString);
kernel.Bind()
.ToMethod(x=>x.Kernel.Get().BeginTransaction());

但我看不出你为什么要这样做。您只需在
UnitOfWork
中使用
Connection.BeginTransaction()
,并从构造函数中删除对
IDbTransaction
的依赖

谢谢你的装订。没有事务,我不能
Commit()
RollBack()
?或者至少我不这么认为。没有事务,你不能提交或回滚。但是您可以让您的
IDBConnection
通过
BeginTransaction()
方法创建
IDbTransaction
。因此,如果
IDbConnection
已经存在,那么您不需要将
IDbTransaction
传递给构造函数——比方说,它们应该绑定在一起。然而,我写的装订实际上也有同样的效果。哦,天哪,很抱歉。我没有意识到
BeginTransaction
返回
IDbTransaction
。谢谢你的帮助!