加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:36:00 所属栏目:百科 来源:网络整理
导读:首先,我有一个dbcontext工厂,它定义了公共类 DatabaseFactory:Disposable,IDatabaseFactory,它只是创建一个上下文(如果尚不存在). 接下来,我有一个通用的存储库,它被定义为公共类Repository T :IRepository T 其中T:在构造函数中获取工厂的类.我有其他具
首先,我有一个dbcontext工厂,它定义了公共类 DatabaseFactory:Disposable,IDatabaseFactory,它只是创建一个上下文(如果尚不存在).

接下来,我有一个通用的存储库,它被定义为公共类Repository< T> :IRepository< T>
其中T:在构造函数中获取工厂的类.我有其他具体的存储库继承自这个.

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

在我的控制器中,我将构造函数设置为公共ProjectController(IDatabaseFactory工厂,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使用Transient范围 – 每次请求类型时都会创建一个新实例.

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

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

示例可能如下所示:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读