其他分享
首页 > 其他分享> > CodeGo.net> Ninject的:是否可以在SingletonScope中有一个父对象,在TransientScope中有一个子对象?

CodeGo.net> Ninject的:是否可以在SingletonScope中有一个父对象,在TransientScope中有一个子对象?

作者:互联网

我已经为此动脑子了好几个星期了……我简直是这样的:

>一堆*服务类
>所有这些都取决于通过EF访问数据库的不同* Repository类
>为了进行单元测试,将DbContext的派生注入到存储库中. (所以我不能使用来处理上下文)

为了正确处理注入的EF上下文,我可以在InRequestScope()或简单的自定义范围中运行我的依赖项树-顶级为InScope(c => new object()),而在所有其他级别为InParentScope()水平.

这两种方法都会在每个请求期间创建并处理很多对象.另外,我们正在谈论一个单页应用程序,以便95%的查询(大约50个)将在2个请求中执行,因此InRequestScope()似乎不是一个好主意. * Service类也没有任何状态,因此可以是InSingletonScope()并可以最大程度地减少对象创建的数量.

问题

是否可以在InSingletonScope()中具有父* Service和* Repository类,并以某种方式将EF DbContext注入到一个范围内,该范围将在每次访问它时返回一个新实例,并将使用NInject兑现IDisposable?

我知道在创建对象时会注入依赖项,但是仍然可以通过某种方式对其进行管理吗?

解决方法:

不,不可能.如果您考虑一下,您应该理解原因.

在应用程序的生存期内,将存在一个单例对象. InRequestScope对象在请求的生存期内存在.由于您的单例存储库将永久存在,并且将保留对DbContext的引用(因为它是依赖项),因此,如果您的存储库没有某种释放它的机制,则无法对dbcontext进行垃圾回收.

即使您确实提供了这种机制,您也必须具有另一种机制才能在下一个请求上重新获取新实例,因为不会创建新的单例存储库(因此将不会调用其构造函数,因此它的依赖关系将无法解决,因此将无法得知新的dbcontext).

因此,实际上,使InRequestScope对象成为单例对象的依存关系将有效地使InRequestScope对象成为单例,否则该对象将从单例下面移开,这可能很糟糕.

另外,在您的存储库确实有状态的情况下,我也希望与您有所不同.状态是DbContext本身.由于Singleton是应用程序范围内的静态实例,因此您将同一实例分配给使用该应用程序的所有用户,这意味着它还将提供相同的DbContext,这是一个很大的禁忌,因为您的用户会互相sto脚DbContext状态.

同样,您的服务也是有状态的,因为它们具有存储库,正如我刚刚指出的那样,它们具有DbContexts,它们是有状态的.

您要做的只是将您的服务,存储库和DbContexts全部设置为InRequestScope.

我不明白为什么这种方法会“在每个请求期间创建很多对象”.重点在于,每个请求仅针对每种对象类型创建一个实例.

标签:architecture,ninject,c
来源: https://codeday.me/bug/20191030/1968721.html