使用Ninject进行深度大于1的上下文/条件依赖注入?

时间:2012-04-19 09:32:41

标签: c# asp.net-mvc dependency-injection ninject ninject-2

我有一个由IDataContextInMemoryDataContext实施的MyApplicationDataContext界面。这被我的所有存储库使用,这些存储库被定义为BananaRepository : IBananaRepository并在其构造函数中获取数据上下文:

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

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

到目前为止,我对接口和服务的使用者是ASP.NET MVC控制器,同步命令和查询。 NInject在我的Web项目中配置,IDataContextMyApplicationDataContext绑定InRequestScope()

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

我已经达到了项目发展的重点,我想开始添加异步处理(命令,事件+处理程序等)。我面临的问题是,对于那些我需要获得瞬态IDataContext(每次都是新的)但是已经为我的控制器的每个请求设置IDataContext实例的绑定。

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

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

    public bool Execute(TArgs args) {}
}

我希望当NInject实例化IAsyncCommand IBananaRepository的类实现(和我所有的其他存储库)时,用IDataContext的新实例而不是用于Web的实例进行初始化要求重复使用(实际上我希望将IAsyncCommand我的IDataContext绑定为InTransientScope()

我该怎么做?

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

1 个答案:

答案 0 :(得分:2)

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

你找到了IsAnyAnchestorNamed。您可以使用相同的循环并将其与您在WhenInjectedInto中找到的条件组合,并从custom When调用它。