2010-07-19 66 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