我有一个由IDataContext
和InMemoryDataContext
实施的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项目中配置,IDataContext
与MyApplicationDataContext
绑定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实例。
答案 0 :(得分:2)
你找到了IsAnyAnchestorNamed。您可以使用相同的循环并将其与您在WhenInjectedInto中找到的条件组合,并从custom When调用它。