如何使用ninject将单个工厂实例注入多个存储库和工作单元

本文关键字:存储 单元 工作 注入 ninject 何使用 单个 实例 工厂 | 更新日期: 2023-09-27 18:21:56

首先,我有一个定义为public class DatabaseFactory : Disposable, IDatabaseFactory的dbcontext工厂,它只是在上下文不存在的情况下创建一个上下文。

接下来,我有一个定义为public class Repository<T> : IRepository<T> where T : class的通用存储库,它在构造函数中使用工厂。我还有其他具体的存储库继承自这个存储库。

我还有一个定义为public class UnitOfWork : IUnitOfWork的工作单元类,它在构造函数中使用工厂,并将所有更改保存到工厂内的上下文(所有存储库都应该使用)。

在我的控制器中,我将构造函数设置为public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep)

基本上,我需要将工厂的相同实例传递到工作单元和所有存储库。使用ninject,它为每个对象创建一个新的工厂,而不是将一个实例传递给所有对象。有没有办法只允许通过ninject传递单个实例,或者我没有正确创建工厂和/或没有正确理解ninject?

以下是我在ninject:中的绑定

kernel.Bind<IProjectRepository>().To<ProjectRepository>();
kernel.Bind<IIssueRepository>().To<IssueRepository>();
kernel.Bind<IUserRepository>().To<UserRepository>();
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>();

如何使用ninject将单个工厂实例注入多个存储库和工作单元

之所以会发生这种情况,是因为默认情况下Ninject使用Transient作用域,每次请求类型时都会创建一个新实例。

更多信息:https://github.com/ninject/ninject/wiki/Object-Scopes

您应该根据应用程序中某个类型的特定实例的实际使用情况指定范围:

示例如下:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();