我有一个由 InMemoryDataContext
和 MyApplicationDataContext
实现的 IDataContext
接口(interface)。这是由我的所有定义为 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 项目中配置,并且使用 InRequestScope()
将 IDataContext
绑定(bind)到 MyApplicationDataContext
。
kernel.Bind<IDataContext>().To<MyApplicationDataContext>().InRequestScope();
kernel.Bind<IBananaRepository>().To<BananaRepository>();
我的项目已经发展到了这样的阶段,我想开始添加异步处理(命令、事件+处理程序等)。我面临的问题是,对于那些我需要获得 transient IDataContext
(每次都是新的)的人,但已经为每个请求的 IDataContext
实例设置了绑定(bind)对于我的 Controller 。
考虑这个简单的场景,我的 DoSomethingAsyncCommand
将在新线程上执行:
class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}
public bool Execute(TArgs args) {}
}
我希望当 NInject 实例化 IAsyncCommand
的类实现时,IBananaRepository
(以及我所有其他存储库)使用 IDataContext
的新实例进行初始化code> 而不是用于重用 Web 请求的请求(实际上,我希望将 IAsyncCommand
我的 IDataContext
绑定(bind)为 InTransientScope()
)
我怎样才能做到这一点?
P.S:我直接使用 CommonServiceLocator 而不是 Ninject 内核来实例化 IAsyncCommand 实例。
最佳答案
在那里您可以找到 IsAnyAnchestorNamed。您可以使用相同的循环,并将其与 WhenInjectedInto 中找到的条件结合起来,然后从 custom When 调用它。 .
关于c# - 使用 Ninject 进行深度大于 1 的上下文/条件依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10225288/