在没有HTTP请求的情况下使用PerRequestLifetimeManager解析类型
本文关键字:PerRequestLifetimeManager 类型 情况下 HTTP 请求 | 更新日期: 2023-09-27 18:20:18
我有一个MVC应用程序,它使用Unity的IoC,并且我有使用PerRequestLifetimeManager
定义的DbContext
实现。此对象通过工作单元实现注入控制器。
container.RegisterType<DBContext, MyContext>(new PerRequestLifetimeManager());
到目前为止,一切都很好,该应用程序有相当数量的型号和控制器。现在我最近想做的是为这个应用程序添加一些自动化任务,为此我想使用HangFire。
我已经在我的项目中设置了这个库,并创建了一个简单的任务,我想在其中调用一个需要DBContext
的操作。
RecurringJob.AddOrUpdate(() => MyTask(), Cron.Daily);
CCD_ 4定义如下
public void MyTask()
{
var taskManager = container.Resolve<ITaskManager>();
taskManager.DoSomething();
}
任务管理器需要DBContext的实例(通过工作单元对象)
public class TaskManager : ITaskManager
{
public TaskManager(IUnitOfWork uow) {
...
}
}
public class UnitOfWork : IUnitOfWork
{
public class UnitOfWork(DBContext context) {
...
}
}
现在我遇到的问题是,每当任务运行时,我都会得到一个异常,即PerRequestLifetimeManager can only be used in the context of an HTTP request
。
有没有一种方法可以在没有HTTP请求的情况下注入这个对象,或者我如何更改Unity配置以支持我的HangFire任务?
我已经不再使用PerRequestLifetimeManager
来解决这个问题。我现在已经开始将HierarchicalLifetimeManager
与容器层次结构一起使用,然后您需要设置应用程序,为每个预期的作用域(如请求或作业)创建一个新的子容器,并在该作用域完成时处理该子容器。
有一些库连接到MVC和WebAPI中,为每个请求创建一个新的子容器。快速搜索MVC:Unity.Mvc5,官方Unity.AspNet.WebApi-NuGet包包含UnityHierarchicalDependencyResolver
。
为了让它与你的任务应用程序一起工作,你必须使用自己的方法来创建一个子容器来控制你的范围,但这很容易。只需调用IUnityContainer childContainer = container.CreateChildContainer()
,使用子容器解析实例并完成工作,然后在作用域结束时调用childContainer.Dispose()
。