gpt4 book ai didi

c# - NamedScopes Ninject 绑定(bind)和异步(线程)

转载 作者:太空狗 更新时间:2023-10-29 21:35:11 25 4
gpt4 key购买 nike

我的项目由服务和存储库构成(所有存储库共享数据库上下文)。在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 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 可以决定随时回收应用程序池,这将立即终止您的线程(或者它在某些情况下根本不执行),使您的应用程序处于不一致状态。

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

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

如果您仍然想走艰难的路,请阅读有关 HostingEnvironment.RegisterObjectIRegisteredObject 的内容,以防止出现这些不一致的情况。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com