我在我的应用程序中使用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绑定依赖项的最佳实践:) 所以我的问题是,如果有另一种解决方案来解决这个问题。 最好的问候,
答案 0 :(得分:2)
如果我了解您的要求,您需要在所有依赖对象中注入相同的IDataBaseContext
实例。这就是Singleton范围的用途。
所以也许不是直接设置构造函数参数,而是可以为IDatabaseContext
配置绑定以始终解析单例实例:
Kernel.Bind<IDatabaseContext>().To<DapperContext>().InSingletonScope();