2009-02-18 28 views
6

对于一个大型项目来说,是否有一个数据环境可以映射出您的数据库,您可以从您的类中进行交互?我应该使用一个LINQ DataContext还是很多?

或者更有意义的是将它分解为小数据环境,这些环境专注于数据库中将需要的特定任务。

我很好奇的表现。我的理解是,datacontext本身是一个非常轻量级的对象,它只会在需要时初始化其内部集合等。因此,处理具有多种定义的数据上下文,但只有两个数据表应该像处理特殊的数据上下文一样快只有这两张表。

我也认为你会在JIT时间受益,因为做数据访问的第一个类将编译你现在可用于所有类的dc。

+0

http://stackoverflow.com/questions/226127/multiple-single-instance-of-linq-to -sql-datacontext – spender 2009-02-18 02:27:28

回答

9

我假设你问的是设计还是运行时模式。我一般会说

尽管可能将数据库分割成多个数据上下文,但如果并且仅当两个上下文之间没有重叠时,这才是可取的。

重叠是为

例如你有一个WebsiteContext和一个AdminContextWebsiteContext用于显示Product并履行Order s。 A WebsiteUser附加到OrderAdminContext用于您的Staff会员处理退款Orders,其中也参考WebsiteUserAdminContext还需要重置密码并更新WebsiteUser的其他详细信息。

你想这样做的,因为你不想要的网站来处理,甚至不知道有关Returns

WebsiteContext 
Product -- Order -- WebsiteUser 

AdminContext 
Staff -- Returns -- Order -- WebsiteUser 

在上面,我们可以看到我们在不同的数据复制许多对象上下文。这听起来很糟糕,它确实表明人为地将数据库分成不同的数据上下文是一个错误的决定。你有没有> 2个数据库,或只有一个?这种重复违反了DRY原则(不要重复自己),因为WebsiteContext.WebsiteUser与AdminContext.WebsiteUser不同,很可能代码在需要关心他们引用哪个的时候会变得混乱。


LINQ的数据上下文只是一个OR映射器,并且需要被当作一个奇特的黑盒子,使得写一些数据访问代码更容易。一些linq演示使它看起来像不再需要其他层,但任何复杂程序仍然受益于分层设计。

将Linq对象视为仅用于轻松传输数据的对象,并创建一个将其隐藏为实现细节的Domain层即可。阅读DDD - 领域驱动设计。

就其本身而言,仅使用UI中的Linq对象最类似于Transaction Script模式。在这种情况下,您仍然可以从具有处理细节的逻辑层中受益。


虽然您可能不希望上下文的责任如此宽泛,但数据上下文只是数据库的表示。这不是一种安全机制,它不能阻止你破坏数据。

1

从“存储库模式”的角度来看,有些东西需要说明具有单独的聚合和最小化聚合之间的导航属性。我不是100%确定那是什么东西虽然...目前我是考虑使用中等大小的dbml,使用它的多个存储库(UI不直接使用datacontexts存储库类),导航属性标记为内部,以便DAL可以使用它们...也许...

相关问题