2010-07-19 67 views
1

我已經做了一些搜索,但一直未能弄清楚如何將LinqToSql數據上下文與指定連接字符串綁定到不同的存儲庫。如何使用LinqToSQL和存儲庫模式爲ASP.NET MVC配置Ninject

當綁定路由時,此綁定在global.ajax中執行。我使用相當標準的存儲庫模式將LinqToSql基礎結構與應用程序分離,以便將來可以更改技術基礎結構(NHibernate,EntityFramework等)。另外,讓我的代碼很容易單元測試和嘲弄。

我有這樣的事情。

string desktopConnectionString = ConfigurationManager.ConnectionStrings["Desktop"].ConnectionString; 
string messagingConnectionString = ConfigurationManager.ConnectionStrings["MessageQueue"].ConnectionString; 
string usersConnectionString = ConfigurationManager.ConnectionStrings["Users"].ConnectionString; 

// Map linqToSql entity types to interfaces 
TableMapper typeFinder = new TableMapper(); 
typeFinder.Define<EzsDashboard>().As<IDashboard>(); 
typeFinder.Define<EzsDashboardGadget>().As<IGadget>(); 
typeFinder.Define<EzsDashboardGadgetAssignment>().As<IGadgetAssignment>(); 
... 

IDesktopRepository dr = new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder))); 
Bind<IDesktopRepository>().ToConstant(dr).InRequestScope(); 

IUserRepository ur = new UserRepository(new LinqToSqlDataSource(new DataContext(usersConnectionString), typeFinder))); 
Bind<IUserRepository>().ToConstant(ur).InRequestScope(); 

IMessageRepository mr = new MessageRepository(new LinqToSqlDataSource(new DataContext(messagingConnectionString), typeFinder))); 
Bind<IMessageRepository>().ToConstant(mr).InRequestScope(); 

雖然這在物理上有效。我發現我的asp.net MVC應用程序中的數據通常會失效。例如,我將添加一個小工具到它顯示的儀表板,如果我檢查數據庫,它會正確保存到數據庫中。我重新加載頁面,儀表板不顯示任何內容。點擊應用程序有時會導致它「刷新」,並顯示保存的數據。

這是可見的另一種方法是,如果我改變我的web.config並觸發應用程序重新加載。當我打開儀表板時,所有內容都完全顯示爲應有的樣子。

有人可以請提供一些幫助,結合連接與字符串> DataContext-> LinqToSqlDataSource-> DomainRepository

回答

1

在我看來就像您的存儲庫超出您期望的範圍。我是否正確地假設您的問題中的代碼位於Ninject模塊或全局應用程序中?如果是這樣,我想這每個綁定更改爲:

Bind<IDesktopRepository>().ToMethod(context => new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder)))).InRequestScope(); 

我相信,你要跨請求同一個資源庫,因爲你已經將它綁定到一個常量。我想爲每個請求提供一個新的存儲庫,以上代碼將提供。

+0

完美。由於BindToConstant,您在存儲庫背後的推理聽起來很合理。我在綁定結束時確實有InRequestScope,但它一定不能正常工作。 您的解決方案刪除了​​一些額外的代碼行並修復了我遇到的陳舊數據問題。非常感謝。 順便說一句,這是在應用程序啓動時執行的; – 2010-07-19 13:51:09

0

我打這個,但是,細想起來,我不知道你問...你能澄清:

  • 在較高的水平,做這些連接字符串實現您的應用程序
  • 你覺得在你的系統是哪裏錯了?
  • 你覺得這是ASP.NET問題還是DI問題?你是否在會議等東西?

您需要表面這樣的東西(假設我的推斷正確,你想動態能夠動態更改應用程序的存儲機制 - 你說你在做什麼,而不是 爲什麼你正在這樣做)作爲應用程序邏輯。

試圖濫用DI容器來爲你做這件事是壞消息 - 它不保留它給予舊配置的對象樹等等。你的應用程序需要管理它。

考慮將存儲從A切換到B的情況。如果應用中的某些內容在您的操作中間與A聯繫並且即將重試?您不希望容器(或任何其他人)將它交給B代替。

這並不是說這樣的事情沒有合法的用例。這只是它們絕對不是常見的情況,或者DI容器通常用於管理的東西。

...或者我可能失去了一些東西 - 在這種情況下,它會是有趣的,聽到你的計劃更多,你如何試圖映射事情作用域等等

+0

我已經更新了更多的上下文的原始問題。我已經說過,這個問題是我認爲是返回的陳舊數據。 正如我特別要求ninject綁定,這是我相信問題的地方。 – 2010-07-19 13:12:22

+0

@Joshua:Blad你已排序。爲了完整性,我會在這裏留下我的'答案'(除非你覺得這個星球會更好,沒有一般的建議,在這種情況下我會很樂意刪除它) – 2010-07-19 16:02:57