首先,我有一个定义为 public class DatabaseFactory : Disposable, IDatabaseFactory
的 dbcontext 工厂如果上下文不存在,它只会创建一个上下文。
接下来,我有一个定义为 public class Repository<T> : IRepository<T>
where T : class
的通用存储库它在构造函数中采用工厂。我还有其他继承自这个的具体存储库。
我还有一个定义为 public class UnitOfWork : IUnitOfWork
的工作单元类它在构造函数中获取工厂并将所有更改保存到工厂内的上下文(所有存储库都应该使用)。
在我的 Controller 中,我将构造函数设置为 public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep)
.
基本上,我需要将相同的工厂实例传递给工作单元和所有存储库。使用 ninject,它为每个对象创建一个新工厂,而不是将单个实例传递给所有对象。有没有办法只允许通过 ninject 传递单个实例,或者我没有正确创建我的工厂和/或没有正确理解 ninject?
这是我在 ninject 中的绑定(bind):
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
使用 Transient
范围 - 每次请求类型时都会创建一个新实例。
更多信息: https://github.com/ninject/ninject/wiki/Object-Scopes
您应该根据整个应用程序中特定类型实例的实际使用来指定范围:
示例可能如下所示:
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
关于c# - 如何使用 ninject 将单个工厂实例注入(inject)多个存储库和工作单元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082983/