如何使用LinqToSQL和Repository Pattern为ASP.NET MVC配置Ninject

时间:2010-07-19 11:54:21

标签: asp.net-mvc linq-to-sql repository-pattern ninject

我已经做了一些搜索,但还没弄清楚如何将LinqToSql数据上下文与指定的连接字符串绑定到不同的存储库。

当注册路由时,此绑定在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并触发应用程序重新加载。当我点击仪表板时,所有内容都会完全按照预期显示。

有人可以提供绑定连接字符串的一些帮助 - &gt; DataContext-&gt; LinqToSqlDataSource-&gt; DomainRepository

2 个答案:

答案 0 :(得分:1)

在我看来,您的存储库已超出您期望的范围。我是否正确地假设您的问题中的代码是在Ninject模块或全局应用程序启动?如果是这样,我会将每个绑定更改为这样的内容:

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

我相信您在请求之间获得了相同的存储库,因为您已将它绑定到常量。我希望每个请求都有一个新的存储库,上面的代码将提供这个存储库。

答案 1 :(得分:0)

我输入了这个,但经过反思,我不知道你在问什么...你能澄清一下:

  • 在较高级别,这些连接字符串在您的应用中实现了什么
  • 你觉得你的系统出了什么问题?
  • 您认为这是ASP.NET问题还是DI问题?你是否正在讨论会议等等??

你需要表达这样的东西(假设我已经正确地推断出你想动态地能够动态地改变你的应用程序的存储机制 - 你已经说明了你在做什么,而不是为什么你这样做)作为应用程序逻辑。

尝试滥用DI容器为您执行此操作是个坏消息 - 它不会保留一个对象树,它会为旧配置提供等等。您的应用程序需要管理它。

考虑将存储从A切换到B的情况。如果您的应用中的某些内容在您的操作过程中与A联系并即将重试,该怎么办?你不希望容器(或其他任何人)把它交给B代替。

这并不是说这些事情没有合法的用例。只是他们绝对不是常见的情况或DI容器通常用来管理的东西。

......或者我可能会遗漏一些东西 - 在这种情况下,听到更多关于你的计划以及你是如何尝试将事物映射到范围等等会很有趣。