- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个将 IoC 与 Unity 结合使用的 MVC 应用程序,并且我有一个使用 PerRequestLifetimeManager
定义的 DbContext
实现。该对象通过工作单元实现注入(inject)到 Controller 。
container.RegisterType<DBContext, MyContext>(new PerRequestLifetimeManager());
到目前为止一切正常,应用程序有相当数量的模型和 Controller 。现在我最近想做的是为此应用程序添加一些自动化任务,为此我想使用 HangFire。 .
我已经在我的项目中设置了这个库并创建了一个简单的任务,我想在其中调用一个需要 DBContext
的操作。
RecurringJob.AddOrUpdate(() => MyTask(), Cron.Daily);
和MyTask()
定义如下
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 context of an HTTP request
。
有没有一种方法可以在没有 HTTP 请求的情况下注入(inject)这个对象,或者我如何更改我的 Unity 配置以也支持我的 HangFire 任务?
最佳答案
我已经不再使用 PerRequestLifetimeManager
来解决这个问题。我现在开始使用 HierarchicalLifetimeManager
和 container hierarchies相反,然后您需要设置您的应用程序以根据预期范围(例如请求或作业)创建一个新的子容器,并在该范围完成时处置该子容器。
有一些库可以挂接到 MVC 和 WebAPI 中,以便为每个请求创建一个新的子容器。快速搜索找到了 MVC 的这个:Unity.Mvc5和官方Unity.AspNet.WebApi NuGet 包包含一个 UnityHierarchicalDependencyResolver
。
要让它与您的任务应用程序一起使用,您必须使用自己的方法来创建一个子容器来控制您的范围,但这很容易。只需调用 IUnityContainer childContainer = container.CreateChildContainer()
,使用子容器解析您的实例并完成您的工作,然后在您的作用域结束时调用 childContainer.Dispose()
.
关于c# - 在没有 HTTP 请求的情况下使用 PerRequestLifetimeManager 解析类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25593487/
我在我的项目中使用 Unity。但是我不确定我是否应该使用 using 语句,因为我正在使用 PerRequestLifetimeManager。 简单的例子: 注入(inject): contain
我有一个 MVC 应用程序,它使用 Unity 作为其 IoC 容器,并使用 PerRequestLifetimeManager 在我的应用程序中定义了多个服务。 . container.Regist
我已经为我们的项目设置了 Unity 以进行依赖注入(inject)。该项目本身是一个使用 MVC 和 Web API 的 ASP.NET 应用程序。 对于数据库上下文,我使用 PerRequestL
我有一个将 IoC 与 Unity 结合使用的 MVC 应用程序,并且我有一个使用 PerRequestLifetimeManager 定义的 DbContext 实现。该对象通过工作单元实现注入(i
我有一个 WEB API 应用程序,我使用 UnityContainer 作为我的 DI。由于我将 UnitOfWork 与 Entity Framework 一起使用,因此我想在每个请求的 Unit
我有以下使用 Unity 初始化实例的代码: IUnityContainer container = new UnityContainer(); container.RegisterType(new
我正在尝试定位 PerRequestLifetimeManager。在 MSDN 中,it says that it is part of the Unity 3 assembly. 我已经通过 Nu
这是我的 UnityConfig.cs: public class UnityConfig { private static Lazy container = new Lazy(() =>
我是一名优秀的程序员,十分优秀!