第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對 DbContext 實例有強制依賴是不是很糟糕?

對 DbContext 實例有強制依賴是不是很糟糕?

C#
慕標琳琳 2021-11-28 17:52:49
也許這個問題有一些解釋,但找不到最好的解決方案:我正在閱讀Mark Seemann 的這篇關(guān)于強制依賴的博客文章,據(jù)我所知,在文章末尾,他得出的結(jié)論是永遠不要使用或至少嘗試避免強制依賴,否則會有麻煩(到目前為止還可以))。這里是另一個職位從Autofac文檔。他們建議僅按目的使用俘虜依賴項(當您知道自己在做什么時?。?。這讓我想到了我在我的網(wǎng)站上遇到的情況。我有 10 個服務,它們都依賴于DbContext數(shù)據(jù)庫操作。我認為它們可以很容易地被注冊,就InstancePerLifetimeScope好像我解決了這個問題,DbContext因為它不會永遠保存在我的服務附帶的內(nèi)存中。(在我的情況下,我使用的是 Autofac)。所以,我認為一個好的起點是根據(jù)生命周期實例和DbContext每個請求創(chuàng)建所有這些實例。然后在我的服務中,我會使用類似的東西:public class MyService{    private readonly IDbContext _dbContext = DependencyResolver.Current.GetService<IDbContext>();    private MyModel GetMyModel() => Mapper.Map<MyModel>(_dbContext.MyTable.FirstOrDefault());}然后在我的啟動課程中,我有:builder.RegisterType<ApplicationDbContext>().As<IDbContext>().InstancePerRequest();builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();這個模式是否正常工作,我的意思是不將dbContext永遠附加到任何服務,所以它將在請求結(jié)束時被處理,如果它有效,這一行是否有任何性能問題: private readonly IDbContext _dbContext = DependencyResolver.Current.GetService<IDbContext>();與構(gòu)造函數(shù)注入相比(從 dbContext 到數(shù)據(jù)庫有很多調(diào)用,所以IDbContext每次我想使用它時我都害怕,因為它可能會消耗資源)?我想dbContext每個請求都實例化而不是每個依賴項實例化的原因是我已經(jīng)在dbContext對象之上實現(xiàn)了工作單元模式。我的控制器中的正常方法如下所示:public ActionResult DoSth(){     using(var unitOfWork = UnitOfWorkManager.NewUnitOfWork())     {           //do stuff          try          {              unitOfWork.Commit();              return View();          }          catch(Exception e)          {              unitOfWork.RollBack();              LoggerService.Log(e);              return View();          }     }}如果這工作正常,那么還有一個我擔心的問題。因此,如果我可以將我的服務作為每個生命周期的實例(DbContext 除外),那么在服務內(nèi)部的每個方法上應用 async-await 以使其成為非阻塞方法是否有任何問題。我問這個dbContext實例使用 async-await 是否有任何問題,例如,我會有這樣的事情:public async MyModel GetMyModel(){   var result = //await on a new task which will use dbcontext instance here   return Mapper.Map<MyModel>(result);}非常感謝任何建議或建議!
查看完整描述

2 回答

?
LEATH

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 中異步支持不完整 -不支持異步子操作。)


查看完整回答
反對 回復 2021-11-28
?
慕容708150

TA貢獻1831條經(jīng)驗 獲得超4個贊

與往常一樣,答案取決于...此配置可以在以下情況下工作:

  1. 您的范圍是在請求邊界內(nèi)創(chuàng)建的。您的工作單元是否創(chuàng)建了范圍?

  2. 在創(chuàng)建作用域之前,您不解析任何 InstancePerLifetimeScope 服務。否則,如果您在請求中創(chuàng)建多個作用域,它們的壽命可能會比應有的更長。

我個人只建議制作任何依賴于 DbContext(直接或間接)InstancePerRequest 的東西。瞬態(tài)也可以。您肯定希望一個工作單元中的所有內(nèi)容都使用相同的 DbContext。否則,使用實體框架的第一級緩存,您可能有不同的服務來檢索相同的數(shù)據(jù)庫記錄,但如果它們不使用相同的 DbContext,則會在不同的內(nèi)存副本上運行。在這種情況下,上次更新將獲勝。

我不會在 MyService 中引用你的容器,只是構(gòu)造函數(shù)注入它。域或業(yè)務邏輯中的容器引用應該謹慎使用,并且僅作為最后的手段。


查看完整回答
反對 回復 2021-11-28
  • 2 回答
  • 0 關(guān)注
  • 223 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號