gpt4 book ai didi

c# - 使用 Ninject 深度大于 1 的上下文/条件依赖注入(inject)?

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:17 26 4
gpt4 key购买 nike

我有一个 IDataContextInMemoryDataContext 实现的接口(interface)和 MyApplicationDataContext .这被我定义为 BananaRepository : IBananaRepository 的所有存储库使用并在其构造函数中获取数据上下文:

interface IDataContext {}
class InMemoryDataContext : IDataContext {}
class MyApplicationDataContext : IDataContext {}

interface IBananaRepository {}
class BananaRepository : IBananaRepository
{
public BananaRepository(IDataContext dataContext) {}
}

到目前为止,我的接口(interface)和服务的消费者是 ASP.NET MVC Controller 、同步命令和查询。 NInject 在我的 Web 项目中配置并且 IDataContext绑定(bind)到 MyApplicationDataContextInRequestScope() .

 kernel.Bind<IDataContext>().To<MyApplicationDataContext>().InRequestScope();
kernel.Bind<IBananaRepository>().To<BananaRepository>();

在我的项目发展过程中,我已经到了要开始添加异步处理(命令、事件+处理程序等)的地步。我面临的问题是,对于那些我需要得到一个短暂的 IDataContext (每次都是新的)但是已经为 IDataContext 设置了绑定(bind)每个 Controller 请求的实例。

考虑这个简单的场景,其中我的 DoSomethingAsyncCommand将在新线程上执行:

class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}

public bool Execute(TArgs args) {}
}

我想当 NInject 实例化 IAsyncCommand 的类实现时IBananaRepository (以及我所有其他存储库)使用 IDataContext 的新实例进行初始化而不是用于重用网络请求的请求(实际上我希望 IAsyncCommand 我的 IDataContext 绑定(bind)为 InTransientScope() )

我该怎么做?

P.S:我直接使用 CommonServiceLocator 而不是 Ninject 内核来实例化 IAsyncCommand 实例。

最佳答案

https://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.cs

在那里你会找到 IsAnyAnchestorNamed。您可以使用相同的循环并将其与您在 WhenInjectedInto 中找到的条件结合起来,并从 custom When 中调用它.

关于c# - 使用 Ninject 深度大于 1 的上下文/条件依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10225288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com