【问题标题】:Resolving type with PerRequestLifetimeManager without HTTP request在没有 HTTP 请求的情况下使用 PerRequestLifetimeManager 解析类型
【发布时间】:2014-08-31 15:31:03
【问题描述】:

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

container.RegisterType<DBContext, MyContext>(new PerRequestLifetimeManager());

到目前为止,一切都运行良好,并且该应用具有相当数量的模型和控制器。现在我最近想做的是为这个应用程序添加一些自动化任务,为此我想使用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 the context of an HTTP request

有没有一种方法可以在没有 HTTP 请求的情况下注入此对象,或者如何更改我的 Unity 配置以支持我的 HangFire 任务?

【问题讨论】:

    标签: c# .net httprequest unity-container hangfire


    【解决方案1】:

    我已经不再使用PerRequestLifetimeManager 来解决这个问题。我现在已经开始使用 HierarchicalLifetimeManagercontainer hierarchies 代替,然后您需要设置您的应用程序以根据预期范围(例如请求或作业)创建一个新的子容器,并在该范围完成时处置该子容器.

    有些库与 MVC 和 WebAPI 挂钩,可以为每个请求创建一个新的子容器。快速搜索找到了这个 MVC:Unity.Mvc5,官方的Unity.AspNet.WebApi NuGet 包包括一个UnityHierarchicalDependencyResolver

    要让它与您的任务应用程序一起工作,您必须滚动自己的方法来创建子容器来控制您的范围,但这很容易。只需调用IUnityContainer childContainer = container.CreateChildContainer(),使用子容器解析您的实例并完成您的工作,然后在您的范围结束时调用childContainer.Dispose()

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 1970-01-01
      • 2018-02-14
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多