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



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

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>();

你可以像这样绑定它。以这种方式,IDbTransaction将与IDbConnection绑定。

var kernel = new StandardKernel();
kernel.Bind<IDbConnection>()
      .To<SqlConnection>()
      .WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IDbTransaction>()
      .ToMethod(x => x.Kernel.Get<IDbConnection>().BeginTransaction());

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

您可以尝试按照以下示例进行操作,以使其正常工作。

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));
        }

这是另一个相关的讨论,作为要查看的附加资源 - Ninject,存储库和DAL

最新更新