- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的项目由服务和存储库构成(所有存储库共享数据库上下文)。在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 Web 请求将在此方法可以开始使用它之前完成并处理上下文。我试图理解NamedScopes如本answer所述.我似乎仍然无法理解如何实现它。我将展示我的项目的结构,希望有人能在代码级别帮助我。
绑定(bind)
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 使用构造函数注入(inject)
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 处理的上下文。
最佳答案
您应该知道运行后台线程会给您带来很多问题。 IIS 可以决定随时回收应用程序池,这将立即终止您的线程(或者它在某些情况下根本不执行),使您的应用程序处于不一致状态。
运行异步操作最简单且最不容易出错的方法是实现一个 Windows 服务并将这些异步操作委托(delegate)给 Windows 服务,例如使用 MSMQ。
如果您仍然想走艰难的路,请阅读有关 HostingEnvironment.RegisterObject
和 IRegisteredObject
的内容,以防止出现这些不一致的情况。
Ninject 部分非常简单。只需创建一些作业处理器类,例如MyJobProcessor
获取执行任务所需的所有依赖项。它应该实现 INotifyWhenDisposed
。最简单的方法是派生自 DisposeNotifyingObject
。
public class MyJobProcessor : DisposeNotifyingObject, IRegisteredObject
{
public void Execute() { ... }
public void Stop(bool immediate) { ... }
}
将这个处理器注入(inject)到 Controller 中,让 Task 启动它,并在它完成工作后释放它。
Task.Factory.StartNew(() =>
{
try
{
processor.Execute();
}
finally
{
processor.Dispose);
}
});
指定它是其依赖项的范围。
Bind<MyJobProcessor>().ToSelf().Named("MyJobProcessor").DefinesNamedScope("MyJobProcessorScope");
Bind<IUnitOfWork>().To<UnitOfWork>().WhenAnyAnchestorNamed("MyJobProcessor").InNamedScope("MyJobProcessorScope");
关于c# - NamedScopes Ninject 绑定(bind)和异步(线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711118/
(这个问题最初是在 Ninject Google Group 中提出的,但我现在看到 Stackoverflow 似乎更活跃。) 我正在使用 NamedScopeExtension 将相同的 View
我正在尝试对我是否在命名范围内进行条件绑定(bind)。 我的接口(interface) ILogger - 使用 Ninject Logger 扩展的默认行为,我们将特定类型的记录器实现注入(inj
我有一个模式,在我工作时一直出现。我几乎完全是一名 Web 开发人员,Ninject 的 InRequestScope 可以满足我 99% 的需求。 这是模式: // abstractions int
我的项目由服务和存储库构成(所有存储库共享数据库上下文)。在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 Web 请求将在此方法可以开始使用它之前完成并处理上下文。我试图理解NamedS
我正在使用 Rails 2.3.9。为了说明这个问题,假设我们在模型上有一个命名范围: class Book 'isbn IS NOT NULL' end 如果你得到了命名范围的类,ActiveRe
问题:在我的模型中,我需要在触发任何 ORM 事件之前使用回调来处理数据库实体对象。另外,我正在寻找一种方法来应用 named-scope所以我不需要为每个查询提供特定条件。举个例子;当我在 dbco
我是一名优秀的程序员,十分优秀!