2

我想解決如何最好地注入我的所有依賴到我爲Web API應用程序編寫的自定義OWIN中間件。一個簡單的例子就是我正在使用的DbContext。我有一些中間件需要根據請求進行潛在查詢。我遇到的問題是我希望我的DbContext具有WebApiRequestLifestyle範圍。我的DbContext註冊爲這樣:注入依賴到OWIN中間件和每個web請求與簡單注入器

container.Register<MobileDbContext>(Lifestyle.Scoped); 

顯然,這不工作:

container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 

因爲我使用喜歡的東西需要MobileDbContext在我中間件:

app.CreatePerOwinContext(() => 
{ 
    return container.GetInstance<MobileDbContext>(); 
}; 

我嘗試了混合的生活方式,但這也不起作用,因爲我認爲中間件在技術上不屬於「範圍」生活方式。我想可能更接近單身。

有沒有更好的方法來設計我的應用程序來避免這個問題或解決某種自定義範圍的生活方式?

回答

3

documentation顯示瞭如何在一個範圍包裝一個OWIN請求的示例:

public void Configuration(IAppBuilder app) { 
    app.Use(async (context, next) => { 
     using (AsyncScopedLifedtyle.BeginScope (container)) { 
      await next(); 
     } 
    }); 
} 

這樣做是包裝在一個執行上下文範圍的OWIN請求。你現在要做的就是讓執行比賽範圍成爲默認範圍的生活方式,如下所示:

container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle(); 
+1

哇,很容易。我沒有很好地閱讀文檔。謝謝一堆! – Carson

+0

如果我想要在中間件和任何API控制器中使用相同的實例,該怎麼辦? 這種方法的問題是 - 它在中間件中注入一個單例實例,並在API控制器中注入webapi作用域實例 – Gokulnath