2

我有一个由 a和IDataContext实现的接口。这被我所有的存储库所使用,这些存储库被定义为并在其构造函数中获取数据上下文:InMemoryDataContextMyApplicationDataContextBananaRepository : IBananaRepository

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

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

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

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

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

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

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

    public bool Execute(TArgs args) {}
}

我希望当 NInject 实例化(和我所有其他存储库)的类实现时,IAsyncCommandIBananaRepository一个新实例初始化,IDataContext而不是重新使用 Web 请求的实例(实际上我希望IAsyncCommandIDataContext被绑定为InTransientScope()

我怎样才能做到这一点?

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

4

1 回答 1

2

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

在那里您可以找到 IsAnyAnchestorNamed。您可以使用相同的循环并将其与您在 WhenInjectedInto 中找到的条件结合起来,然后从自定义 When调用它。

于 2012-04-19T12:40:48.847 回答