2014-08-31 49 views
4

我有一個使用IoC和Unity的MVC應用程序,我使用PerRequestLifetimeManager定義了一個DbContext實現。該對象通過工作單元實施注入控制器。使用PerRequestLifetimeManager解析沒有HTTP請求的類型

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請求該對象或我怎樣才能改變我的統一配置,也支持我的遲髮型任務?

回答

10

我已經使用PerRequestLifetimeManager這個問題很搬走。我現在開始使用HierarchicalLifetimeManagercontainer hierarchies來代替,然後您需要設置您的應用程序以在每個預期範圍(例如請求或作業)中創建一個新的子容器,並在該範圍完成時處理該子容器。

有一些庫掛鉤到MVC和WebAPI中,爲每個請求創建一個新的子容器。快速搜索發現這一個MVC:Unity.Mvc5和官方Unity.AspNet.WebApi NuGet包包括UnityHierarchicalDependencyResolver

爲了得到這個與你的任務應用工作,你將不得不推出自己的方法來創建一個子容器來控制你的範圍,但這是很容易的。只需致電IUnityContainer childContainer = container.CreateChildContainer(),使用子容器解析您的實例並完成您的工作,然後在示波器調用結束時撥打childContainer.Dispose()