NamedScopes Ninject绑定和异步(线程)

我的项目由服务和存储库构成(所有存储库共享数据库上下文)。 在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 在此方法可以使用之前,Web请求将完成并处理上下文。 我试图理解这个答案中所述的NamedScopes 。 我似乎还无法理解如何实现它。 我将展示我的项目是如何构建的,并希望有人可以在代码级别帮助我。

绑定

private static void RegisterServices(IKernel kernel) { //dbcontext kernel.Bind().ToMethod(context => new EntityDatabaseContext()).InRequestScope(); //unit of work kernel.Bind().To().InRequestScope(); //repositories kernel.Bind<IRepository>().To<Repository>().InRequestScope(); //services kernel.Bind().To().InRequestScope(); } 

AuthenticationService使用构造函数注入

 public AuthenticationService(UnitOfWork unitOfWork, IRepository 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处理的上下文。

您应该知道运行后台线程可能会导致许多问题。 IIS可以随时决定回收应用程序池,这将立即终止您的线程(或者在某些情况下根本不执行),使您的应用程序处于不一致状态。

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

运行异步操作的最简单且最不容易出错的方法是实现Windows服务并将这些异步操作委托给Windows服务,例如使用MSMQ。

如果你仍然想要努力,那么请阅读HostingEnvironment.RegisterObjectIRegisteredObject以防止这些不一致的情况。

Ninject部分非常简单。 只需创建一些作业处理器类,例如MyJobProcessor获取所有必需的依赖项来执行任务。 它应该实现INotifyWhenDisposed 。 最简单的方法是从DisposeNotifyingObject派生。

 public class MyJobProcessor : DisposeNotifyingObject, IRegisteredObject { public void Execute() { ... } public void Stop(bool immediate) { ... } } 

将此处理器注入控制器,然后让Task启动它并在完成工作后将其处理掉。

 Task.Factory.StartNew(() => { try { processor.Execute(); } finally { processor.Dispose); } }); 

指定它是其依赖项的范围。

 Bind().ToSelf().Named("MyJobProcessor").DefinesNamedScope("MyJobProcessorScope"); Bind().To().WhenAnyAnchestorNamed("MyJobProcessor").InNamedScope("MyJobProcessorScope");