我有跨两个数据存储存储的业务对象。对象的一部分存储在 Azure 表存储中,另一部分存储在 Azure SQL 中。基本上 SQL 部分用于查询,而表存储用于占用大量空间的属性。
大多数时候,只使用对象的 SQL 部分(在 SQL 查询中)。仅当有人明确要求该对象时才需要表存储属性。我想要实现的设计将隐藏业务对象背后有两个数据源的事实,延迟加载存储表属性(因为在执行 SQL 查询时不需要它们)并且仍然使代码可测试。
我当前的设计有一些由工作单元创建的 POCO。我不想创建两个 POCO,一个用于表存储,一个用于 SQL,所以我在考虑以下设计:
//Make the properties virtual
public class Customer
{
public virtual string Name {get;set;} //Stored in SQL
public virtual string Age {get;set;} //Stored in SQL
public virtual string Details {get;set;} // This prop is stored in Table Storage
}
//Create a derived internal POCO that can notify when a property is asked
internal class CustomerWithMultipleStorage
{
public event EventHandler OnDetailsGet;
public override string Details
{
get { if (OnDetailsGet!=null) OnDetailsGet( ... ); /* rest of the code */ }
set { /* code */ }
}
}
我所有的数据层代码都可以使用,CustomerWithMultipleStorage
而 DL 之外的所有“外部”代码都将使用Customer
,并且不会暴露事件。现在,当工作单元返回 aCustomer
时,它将仅加载 SQL 属性并订阅 Get 事件。如果使用 Customer 的人需要其余属性,则将触发事件并加载表存储属性。
你觉得这个设计怎么样?这是正确的方法吗?你知道这样做的更好方法吗?