c# - 在没有 HTTP 请求的情况下使用 PerRequestLifetimeManager 解析类型

标签 c# .net httprequest unity-container hangfire

我有一个将 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 来解决这个问题。我现在开始使用 HierarchicalLifetimeManagercontainer 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/

相关文章:

c# - 有谁知道任何 C# BDD(二元决策图)包?

c# - 如何从 MS SQL 数据表中检索列默认值

c# - 什么是 .NET 托管模块?

c# - 单击按钮时从资源中随机播放图片

c# - 两个日期之间有月份差异的Linq查询

c# - 为什么使用 "as"运算符进行转换会导致使用 C# 动态转换的对象为 null

.net - VSTO:无法打开另一个 Excel 文件,而第一个文件被加载项的模式窗口阻止

python - 向服务器 :80 port Simultaneously 发送多个 GET 请求

node.js - dialogflow 代理不从 HTTP 请求回调中输出文本

vba - 从 Word 使用 VBA 发送 HTTP 请求