c# - 如何使用 ninject 将单个工厂实例注入(inject)多个存储库和工作单元?

标签 c# asp.net-mvc ninject

首先,我有一个定义为 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/

相关文章:

jquery - 通过 Ajax 启动 session

c# - 从表达式中获取字符串属性名称

ioc-container - IoC/DI - 在只有内部方法的内部类中实现

c# - 自托管 Web API 时使用 Ninject InRequestScope()

c# - nameof() 是否在编译时评估?

c# - 将 map 控件的子级设置为最顶层

c# - 更新面板内的中继器 - ItemComand 代码问题 - 在代码隐藏中使用 ScriptManager 调用 javascript 函数

asp.net-mvc - 在 ASP.NET MVC 中保存具有外键的实体

c# - 使用 Ninject 解决对先前绑定(bind)的依赖

c# - 参数值 '163753323027.987000000' 超出范围