将绑定作为构造函数参数注入另外两个绑定

时间:2014-06-01 09:12:37

标签: c# binding ninject

我在我的应用程序中使用Ninject作为IoC容器。 我有数据库上下文,工作单元和存储库的绑定。 它看起来如下:

// Database
Kernel.Bind<IDbConnection>().To<SqlConnection>();
Kernel.Bind<IDatabaseContext>().To<DapperContext>();

Kernel.Bind<IUnitOfWork>().To<UnitOfWork>();

// Repositories
Kernel.Bind<IUserCommandRepository>().To<UserCommandRepository>();

现在,我想将DatabaseContext的相同实例传递给UnitOfWork和存储库。 我找到了这个解决方案:Ninject: Bind Constructor Argument to Property of Other Object但它对我不起作用。当我运行此代码时:

public RegisterCommandHandler(IUnitOfWork unitOfWork, IUserCommandRepository userCommandRepository)
{
    _unitOfWork = unitOfWork;
    _userCommandRepository = userCommandRepository;
}

UnitOfWork上下文与存储库上下文不同。 所以在我的绑定类中,我创建了本地var,它获取了databaseContext的实例,并将此var作为构造函数参数传递给工作单元和存储库。 最终代码如下所示:

// Database
Kernel.Bind<IDbConnection>().To<SqlConnection>();
Kernel.Bind<IDatabaseContext>().To<DapperContext>();

// Gets database context
var databaseContext = Kernel.Get<IDatabaseContext>();

Kernel.Bind<IUnitOfWork>().To<UnitOfWork>().WithConstructorArgument("context", databaseContext);

// Repositories
Kernel.Bind<IUserCommandRepository>().To<UserCommandRepository>().WithConstructorArgument("context", databaseContext);

它完美无缺,但我不确定它是否是使用Ninject绑定依赖项的最佳实践:) 所以我的问题是,如果有另一种解决方案来解决这个问题。 最好的问候,

1 个答案:

答案 0 :(得分:2)

如果我了解您的要求,您需要在所有依赖对象中注入相同的IDataBaseContext实例。这就是Singleton范围的用途。

所以也许不是直接设置构造函数参数,而是可以为IDatabaseContext配置绑定以始终解析单例实例:

Kernel.Bind<IDatabaseContext>().To<DapperContext>().InSingletonScope();