我的项目由服务和存储库(所有存储库共享数据库上下文)构成。在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。在该方法可以使用之前,Web请求将完成并处理上下文。我尝试了解answer中所述的NamedScopes。我似乎仍然无法理解如何实现它。我将展示我的项目是如何构建的,并希望有人能够在代码级别帮助我。NamedScopes Ninject绑定和异步(线程)
绑定
private static void RegisterServices(IKernel kernel)
{
//dbcontext
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
//unit of work
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
//repositories
kernel.Bind<IRepository<Account>>().To<Repository<Account>>().InRequestScope();
//services
kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InRequestScope();
}
的AuthenticationService使用构造器注入
public AuthenticationService(UnitOfWork unitOfWork, IRepository<Account> accountRepository){}
的方法,我的AuthenticationService内部
//this is a background process
public Task SomeMethodAsync(string text)
{
//spin it off into a new task
return Task.Factory.StartNew(() => SomeMethod(text));
}
SomeMethod
利用accountRepository
。请告诉我是否需要更多信息。请帮我解决线程问题,如果NamedScopes是解决方案,我如何在我的情况下实现它?
基本上,后台进程正在执行,并且由于请求范围,它正在使用由ninject处理的上下文。
请您详细说明您想实现的目标吗?你只是想要异步地在你的方法SomeMethodAsync中加载一些数据,或者你想在后台处理一些像时尚这样的工作中的信息吗? 您的设计中的一个主要问题是,您正在直接启动SomeMethodAsync中的新任务。开始一项新任务并不能保证任务的执行。任务可能会在您的请求结束后执行,然后ninject已经在请求范围内处理完毕。如果您使用AsyncController,则应该在其上注册该任务。但是API不应该启动它 – 2012-07-30 15:01:54
@DanielMarbach这是我的问题,任务可能在请求结束并且ninject处理上下文之后执行。我需要告诉ninject等待。不知道如何做到这一点。 – 2012-07-30 17:37:51
@DanielMarbach你是什么意思API不应该启动它? – 2012-07-30 17:38:56