2012-04-06 36 views
0

當我將我的上下文綁定爲InRequestScope時,在DelegatingHandler中的代碼被調用(在Application_Start中實例化並在控制器初始化之前執行)時處理上下文。如果我使用InTransientScope,那麼它可以工作,但我想要1個上下文。基於這個回答here,這是擁有1個上下文的正確方法。InRequestScope爲DelegatingHandlers處理entitycontext

的Global.asax

static void Configure(HttpConfiguration config) 
{ 
    var kernel = NinjectWebCommon.Bootstrapper.Kernel; 
    config.MessageHandlers.Add(new ApiKeyHandler(kernel.Get<IApiService>())); 
} 

綁定

//if i remove InRequestScope here, everything works. 
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 

//repositories 
kernel.Bind<IRepository<Application>>().To<Repository<Application>>().InRequestScope(); 

//services 
kernel.Bind<IApiService>().To<ApiService>().InRequestScope(); 

所以每當SendAsync被稱爲ApiKeyHandler,上下文已經佈置。但是當一個控制器被調用時(在調用ApiKeyHandler之後),上下文沒有問題。我不太確定發生了什麼事。如果它無法與InRequestScope一起使用,那麼我怎麼能夠像鏈接問題中的答案那樣完成它呢? 1上下文InTransientScope和所有其他InRequestScope?

回答

1

爲消息處理程序使用臨時或單例作用域上下文使您可以限制所有實體將被緩存用於消息處理程序。例如。如果一個實體被更改/刪除或添加了一個新的實體,那麼您的消息處理程序將永遠不會適應該更改。在數據永不改變的情況下,這可以是確定的。

如果您需要對最新的數據進行操作,那麼您將無法使用這些範圍。但是InRequestScope意味着您必須每次使用工廠創建一個新的服務實例(請參閱factory extension)。這樣你可以在請求範圍內擁有上下文。

相關問題