Sha*_*ean 6 c# asp.net-mvc ninject
我的项目由服务和存储库构成(所有存储库共享数据库上下文).在我的一个服务层中,我有一个使用存储库写入数据库的异步方法.在此方法可以使用之前,Web请求将完成并处理上下文.我试图理解这个答案中所述的NamedScopes.我似乎还无法理解如何实现它.我将展示我的项目是如何构建的,并希望有人可以在代码级别帮助我.
绑定
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();
}
Run Code Online (Sandbox Code Playgroud)
AuthenticationService使用构造函数注入
public AuthenticationService(UnitOfWork unitOfWork, IRepository<Account> accountRepository){}
Run Code Online (Sandbox Code Playgroud)
我的AuthenticationService中的一个方法
//this is a background process
public Task SomeMethodAsync(string text)
{
//spin it off into a new task
return Task.Factory.StartNew(() => SomeMethod(text));
}
Run Code Online (Sandbox Code Playgroud)
SomeMethod利用accountRepository.如果需要更多信息,请告诉我.请帮我解决线程问题,如果NamedScopes是解决方案,我该如何在我的情况下实现它?
基本上,正在执行后台进程,并且它正在使用由于请求范围而由ninject处理的上下文.
您应该知道运行后台线程可能会导致许多问题.IIS可以随时决定回收应用程序池,这将立即终止您的线程(或者在某些情况下根本不执行),使您的应用程序处于不一致状态.
运行异步操作的最简单且最不容易出错的方法是实现Windows服务并将这些异步操作委托给Windows服务,例如使用MSMQ.
如果你仍然想要努力,那么请阅读HostingEnvironment.RegisterObject并IRegisteredObject防止这些不一致的情况.
Ninject部分非常简单.只需创建一些作业处理器类,例如,MyJobProcessor获取所有必需的依赖项来执行任务.它应该实施INotifyWhenDisposed.最简单的方法是从中衍生出来DisposeNotifyingObject.
public class MyJobProcessor : DisposeNotifyingObject, IRegisteredObject
{
public void Execute() { ... }
public void Stop(bool immediate) { ... }
}
Run Code Online (Sandbox Code Playgroud)
将此处理器注入控制器,然后让Task启动它并在完成工作后将其处理掉.
Task.Factory.StartNew(() =>
{
try
{
processor.Execute();
}
finally
{
processor.Dispose);
}
});
Run Code Online (Sandbox Code Playgroud)
指定它是其依赖项的范围.
Bind<MyJobProcessor>().ToSelf().Named("MyJobProcessor").DefinesNamedScope("MyJobProcessorScope");
Bind<IUnitOfWork>().To<UnitOfWork>().WhenAnyAnchestorNamed("MyJobProcessor").InNamedScope("MyJobProcessorScope");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |