使用不带HTTP请求的PerRequestLifetimeManager解析类型

我有一个使用IoC与Unity的MVC应用程序,我有一个使用PerRequestLifetimeManager定义的DbContext实现。 该对象通过工作单元实现注入控制器。

 container.RegisterType(new PerRequestLifetimeManager()); 

到目前为止,一切都运行良好,应用程序有相当数量的模型和控制器。 现在我最近要做的是为这个应用程序添加一些自动化任务,为此我想使用HangFire 。

我在我的项目中设置了这个库并创建了一个简单的任务,我想在其中调用一个需要DBContext的动作。

 RecurringJob.AddOrUpdate(() => MyTask(), Cron.Daily); 

MyTask()定义如下

 public void MyTask() { var taskManager = container.Resolve(); taskManager.DoSomething(); } 

任务管理器需要一个DBContext实例(通过Unit of Work对象)

 public class TaskManager : ITaskManager { public TaskManager(IUnitOfWork uow) { ... } } public class UnitOfWork : IUnitOfWork { public class UnitOfWork(DBContext context) { ... } } 

现在我遇到的问题是每当任务运行时我都会得到exception,说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()