2 回答

TA貢獻1936條經(jīng)驗 獲得超7個贊
我會從遠處解決這個問題。
有一些建筑選擇可以讓您的生活更輕松。在 Web 開發(fā)中,將應用程序設計為具有無狀態(tài)服務層(所有狀態(tài)都保存在 DB 中)并適合一個 HTTP 請求、一種業(yè)務操作原則(換句話說,一種服務方法用于一個控制器操作)是可行的。
我不知道你的架構(gòu)看起來如何(你的帖子中沒有足夠的信息來確定)但它很可能符合我上面描述的標準。
在這種情況下,可以很容易地決定選擇哪一個部件壽命:和的DbContext服務類可短暫(InstancePerDependency在Autofac的術(shù)語)或每請求(InstancePerRequest) -這其實并不重要。關(guān)鍵是它們具有相同的生命周期,因此根本不會出現(xiàn)強制依賴的問題。
上述內(nèi)容的進一步含義:
您可以在您的服務類中使用 ctor 注入而無需擔心。(無論如何,在調(diào)查了生命周期范圍和 IOwned<T>等生命周期控制可能性之后,服務定位器模式將是最后一個選擇。)
EF 本身通過適用于大多數(shù)情況的SaveChanges實現(xiàn)了工作單元模式。實際上,如果事務處理由于某種原因不能滿足您的需要,您只需在 EF 上實現(xiàn) UoW。這些都是比較特殊的情況。
[...] 在服務內(nèi)部的每個方法上應用 async-await 以使其成為非阻塞方法是否有任何問題。
如果您始終如一地將 async-await 模式(我的意思是等待所有異步操作)直接應用到您的控制器操作(返回Task<ActionResult>而不是ActionResult),就不會有問題。(但是,請記住,在 ASP.NET MVC 5 中異步支持不完整 -不支持異步子操作。)

TA貢獻1831條經(jīng)驗 獲得超4個贊
與往常一樣,答案取決于...此配置可以在以下情況下工作:
您的范圍是在請求邊界內(nèi)創(chuàng)建的。您的工作單元是否創(chuàng)建了范圍?
在創(chuàng)建作用域之前,您不解析任何 InstancePerLifetimeScope 服務。否則,如果您在請求中創(chuàng)建多個作用域,它們的壽命可能會比應有的更長。
我個人只建議制作任何依賴于 DbContext(直接或間接)InstancePerRequest 的東西。瞬態(tài)也可以。您肯定希望一個工作單元中的所有內(nèi)容都使用相同的 DbContext。否則,使用實體框架的第一級緩存,您可能有不同的服務來檢索相同的數(shù)據(jù)庫記錄,但如果它們不使用相同的 DbContext,則會在不同的內(nèi)存副本上運行。在這種情況下,上次更新將獲勝。
我不會在 MyService 中引用你的容器,只是構(gòu)造函數(shù)注入它。域或業(yè)務邏輯中的容器引用應該謹慎使用,并且僅作為最后的手段。
- 2 回答
- 0 關(guān)注
- 223 瀏覽
添加回答
舉報