我有存储在两个数据存储区中的业务对象。对象的一部分存储在Azure表存储中,另一部分存储在Azure SQL中。基本上SQL部分用于查询,而表格存储用于占用大量空间的属性。UnitOfWork with lazy loading and multiple data source
大多数情况下,只使用对象的SQL部分(在SQL查询中)。仅当有人明确要求该对象时,才需要“表格存储”属性。我试图实现的是一个设计,它隐藏了业务对象背后有两个数据源的事实,延迟加载存储表属性(因为它们在执行SQL查询时不需要)并仍使代码可测试。
我目前的设计有一些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
,并且事件不会被暴露。现在,当工作单元返回Customer
时,它将只加载SQL属性并订阅Get事件。如果使用该客户的人需要其余的属性,则该事件将被触发并且表格存储属性将被加载。
您对这种设计有什么看法?这是正确的方法吗?你知道更好的方法吗?