我有一个由 a和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
为我的控制器的每个请求设置的实例。
考虑这个简单的场景,myDoSomethingAsyncCommand
将在一个新线程上执行:
class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}
public bool Execute(TArgs args) {}
}
我希望当 NInject 实例化(和我所有其他存储库)的类实现时,IAsyncCommand
用IBananaRepository
一个新实例初始化,IDataContext
而不是重新使用 Web 请求的实例(实际上我希望IAsyncCommand
我IDataContext
被绑定为InTransientScope()
)
我怎样才能做到这一点?
PS:我直接使用 CommonServiceLocator 而不是 Ninject 内核来实例化 IAsyncCommand 实例。