【发布时间】:2012-06-13 10:55:23
【问题描述】:
这是一个非常奇怪的架构。请多多包涵。
我们有一个现有的分层应用程序(数据、逻辑/服务、客户端)。 最新的要求是服务层要访问两个数据源!!! (别无他法) 这两个数据源具有相同的数据库架构。
与大多数分层架构一样,我们有如下读写方法:
IEnumerable<Product> GetAllProducts(),
Product GetProductById(ProductKey id),
IEnumerable<Product> FindProductsByName(string name)
产品 DTO 是:
class Product
{
public ProductKey Key { get; set;}
...
}
class ProductKey
{
public long ID { get; }
}
我们将其缩小为两种可能的解决方案:
备选方案 1:
在读取方法中添加一个参数,以便服务知道要使用什么数据库,如下所示:
产品 GetProductById(ProductKey id, DataSource dataSource)
DataSource 是一个枚举。
备选方案 2(我的解决方案): 将 DataSource 属性添加到键类。这将在检索对象时由实体框架设置。此外,这不会被持久化到数据库中。
class ProductKey
{
public long ID { get; }
public DataSource Source { get; } //enum
}
优点是更改对客户的影响很小。
但是,人们不喜欢这种解决方案,因为
-
DataSource不会增加业务价值。 (我的回答是ID也不会增加商业价值。它是一个代理键。它的 目的是跟踪持久性) - 对象图中的子节点也将包含
DataSource,这是多余的
哪种解决方案更合理?你还有其他选择吗?
注意:这些服务无处不在。
【问题讨论】:
-
数据库架构是相同的,但 DTO 本身是否有任何信息可以提供有关要转到哪个数据源的线索?从客户端的角度来看,键或数据源会在什么时候设置?
-
客户端将选择要搜索的数据源(例如:GetAllNewProducts([the datasource]))。然后,返回的产品可以在另一个视图中查看和(如果它来自数据源 A,则可编辑)。请注意,此视图将执行其他查询以获取与产品相关的项目(例如:GetRelatedProducts(ProductKey))。
-
我扩展了 ObjectContext(或 DbContext)以在从查询创建对象时自动设置 DataSource。
-
DTO 只能转到一个数据源。另一个数据源是只读的。
-
您可以全局切换连接字符串,而不是按对象选择数据源吗?还是他们可以根据产品或项目进行切换?
标签: c# entity-framework nhibernate architecture n-tier-architecture