Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有HTTP请求的情况下使用PerRequestLifetimeManager解析类型_C#_.net_Httprequest_Unity Container_Hangfire - Fatal编程技术网

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

C# 在没有HTTP请求的情况下使用PerRequestLifetimeManager解析类型,c#,.net,httprequest,unity-container,hangfire,C#,.net,Httprequest,Unity Container,Hangfire,我有一个使用IoC和Unity的MVC应用程序,我有一个使用PerRequestLifetimeManager定义的DbContext实现。此对象通过工作单元实现注入控制器 container.RegisterType<DBContext, MyContext>(new PerRequestLifetimeManager()); 而MyTask()的定义如下 public void MyTask() { var taskManager = container.Resolve

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

container.RegisterType<DBContext, MyContext>(new PerRequestLifetimeManager());
MyTask()
的定义如下

public void MyTask()
{
    var taskManager = container.Resolve<ITaskManager>();
    taskManager.DoSomething();
}
现在的问题是,每当任务运行时,我都会得到一个异常,即
PerRequestLifetimeManager只能在HTTP请求的上下文中使用


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

对于这个问题,我已经不再使用
PerRequestLifeTime Manager
。我现在已经开始使用
HierarchyCallifeTimeManager
代替,然后您需要设置应用程序,以便为每个预期范围(例如请求或作业)创建一个新的子容器,并在该范围完成时处置该子容器

有一些库与MVC和WebAPI挂钩,以便为每个请求创建一个新的子容器。通过快速搜索找到了这一个MVC:并且官方的NuGet包包括一个
UnityHierarchicalDependencyResolver

要使它与任务应用程序一起工作,您必须使用自己的方法创建一个子容器来控制您的范围,但这非常简单。只需调用
IUnityContainer childContainer=container.CreateChildContainer()
,使用子容器解析实例并完成工作,然后在范围调用的末尾调用
childContainer.Dispose()

public void MyTask()
{
    var taskManager = container.Resolve<ITaskManager>();
    taskManager.DoSomething();
}
public class TaskManager : ITaskManager
{
    public TaskManager(IUnitOfWork uow) {
        ...
    }
}

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