6

我是一般的國際奧委會新成員,我很努力地瞭解我所做的是否有意義。我有一個Web窗體應用程序,我想創建一個模塊來爲我定義一些綁定。這些綁定將用於將存儲庫注入我的業務經理類,使我能夠對業務經理進行單元測試。另外我想使用容器將Entity Framework上下文注入到我的存儲庫中,這樣他們就可以根據http請求共享相同的上下文。所以這是我想知道:將Ninject IKernel存儲在Web應用程序中的位置?

  1. 我明白,我需要有相同的內核實例管理自己的對象的創建和他們的一生。例如,如果我想要一個一次一個httprequest類型的場景,我需要內核的實例在那段時間內可用。如果我需要一個單身人士怎麼辦?然後,它必須以某種方式成爲應用程序範圍。那麼我究竟在哪裏存儲IKernel實例?看起來我可能希望在我的Global.asax中將其設置爲靜態,這是正確的方法並且是線程安全問題嗎?

  2. 因爲我使用綁定<>來定義我的綁定,所以當我不應該從UI引用數據訪問層時,如何在Web/UI層中定義該定義?我的引用看起來像.Web - > .Business - > DataAccess。看起來我想告訴內核「嘿,管理我的數據訪問實例,但沒有在編譯時引用它們。」綁定像這樣:

 

    //Any object requesting an instance of AdventureWorksEntities will get an instance per request 
    Bind<AdventureWorksEntities>().ToSelf().InRequestScope(); 
 

我覺得我可能會被錯誤地處理這個,謝謝。

+0

http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor – 2010-08-06 20:55:27

回答

1

請參閱第1部分 - 查看Ninject.Web擴展 - 它將內核保留在應用程序級別。然後,您可以管理其他壽命較短的其他資源。

而且,看看在這裏對一般的EF和L2S DataContext的管理WRT Ninject和DI問題和實例(它拿出[在過去的幾個星期)

UPDATE:This answer to another question from the same OP is far more concrete(有一個KernelContainer類有.Inject(object).Kernel

+0

Ruben我看着Ninject.Web,它看起來好像是我一直在尋找的東西。我在猜測這個擴展利用了下面的一些「全局」靜態內核引用,實質上是通過使其成爲Global.asax的靜態屬性來完成我自己正在做的事情。然而,沿着Ninject.Web路徑走,我不需要擔心線程安全問題,因爲我確信他們已經處理好了這一點。 – e36M3 2010-08-09 14:45:52

+0

@ e36M3酷手柄/車(我是BH5 Blitzen:D)。你有它,減去'靜態'推斷 - 它是每個HttpApplication(每個進程和/或AppDomain可以大於1),它可以稍微不同。確保你看看那些其他的文章 - 你需要在處理流程中的適當位置提交你的數據庫工作,而不是期望Ninject通過IDisposable等在正確的時間執行它。 - Ninject不處理,但是異步過了一段時間 - 不一定在請求處理期間。 – 2010-08-09 15:21:53

+0

謝謝Ruben,我會做更多的挖掘。我知道必須有一種方法來讓它在請求結束時自動提交實體框架上下文(類似於NHibernate),我會對之前的帖子進行一些掃描,以查看是否可以找到某些謊言。現在,我有負責調用SaveChanges方法的「事務」中的最後一位業務經理。再次感謝。 – e36M3 2010-08-09 15:46:02

1

這真的取決於您的網絡應用程序的複雜性。

這聽起來像你有一個業務和數據訪問層;我會親自建立一個'基礎設施'層,我將存儲我的DI存儲庫和幫助類。

+0

感謝約翰,我覺得你的建議是真的去避免的唯一途徑層之間的耦合。我沒有使用任何其他容器,但我會想如果配置是基於XML的,這可能已經被避免,這意味着容器將在運行時解析DLL。 – e36M3 2010-08-09 14:42:56

相關問題