2013-02-06 53 views
3

我有存储在两个数据存储区中的业务对象。对象的一部分存储在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事件。如果使用该客户的人需要其余的属性,则该事件将被触发并且表格存储属性将被加载。

您对这种设计有什么看法?这是正确的方法吗?你知道更好的方法吗?

回答

1

可能使用Lazy<T>与依赖注入。请注意,这只是给你一些想法。你也可以使用一个数据层和每个对象的映射数据(我将在后面提供例子)。