【发布时间】:2012-07-29 16:57:31
【问题描述】:
我的项目由服务和存储库构成(所有存储库共享数据库上下文)。在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 Web 请求将在此方法开始使用之前完成并处理上下文。我试图理解NamedScopes,正如answer 中所述。我似乎仍然无法理解如何实现它。我将展示我的项目的结构,并希望有人可以在代码级别帮助我。
绑定
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 不应该启动它
-
@DanielMarbach 这是我的问题,该任务可能会在请求结束并 ninject 处理上下文后执行。我需要告诉ninject 等待。不知道该怎么做。
-
@DanielMarbach 你是什么意思 API 不应该启动它?
-
关于开始:我错了。 TPL 指南声明您必须启动该任务。所以那个很好。在我看来,这个问题与ninject无关。您需要使用 AsyncController 并使用异步控制器进行异步操作。那么它应该可以工作了。
-
你想达到什么目的?您是希望在任务启动后立即完成 Web 请求,还是希望请求等待任务的某些结果,以便您可以从该结果中返回一些信息?
标签: c# asp.net-mvc ninject