我已经做了一些搜索,但一直未能弄清楚如何将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
完美。由于BindToConstant,您在存储库背后的推理听起来很合理。我在绑定结束时确实有InRequestScope,但它一定不能正常工作。 您的解决方案删除了一些额外的代码行并修复了我遇到的陈旧数据问题。非常感谢。 顺便说一句,这是在应用程序启动时执行的; – 2010-07-19 13:51:09