2012-04-07 90 views
4

哪一个是实现业务对象(以及为什么)更受欢迎的方式?带上下文的业务对象?

没有单独的 “上下文”

class Product 
{ 
    public string Code { get; set; } 

    public void Save() 
    { 
     using (IDataService service = IoC.GetInstance<IDataService>()) 
     { 
      service.Save(this); 
     } 
    } 
} 

而且用法是:

Product p = new Product(); 
p.Code = "A1"; 
p.Save(); 

设有独立的 “上下文”

class Product 
{ 
    private IContext context; 

    public Product(IContext context) 
    { 
     this.context = context; 
    } 

    public string Code { get; set; } 

    public void Save() 
    { 
     this.context.Save(this); 
    } 
} 

而且用法是:

using (IContext context = IoC.GetInstance<IContext>()) 
{ 
    Product p = new Product(context); 
    p.Code = "A1"; 
    p.Save(); 
} 

这一切都在BL层(除使用示例)发生,没有关系数据库等IDataService是接口将数据层保存业务对象“的地方”。 IContext基本上以某种方式包装IDataService。实际业务对象更复杂,具有更多属性和相互引用(如Order - > OrderRow < - Product)。

我的看法是,第一种方法是(太)简单,第二个选择给单一的业务对象实例之外更多的控制权....?有这样的指导吗?

回答

3

我个人选择第三个版本,其中对象本身并不知道如何保存自己,而是依赖于另一个组件进行保存。当有多种方法来保存对象时,这会变得很有趣,比如说将它保存到数据库,JSON流和XML流。这些对象通常被称为串行器。

所以你的情况,我会去像这样简单:

class Product 
{ 
    public string Code { get; set; } 
} 

为IContext序列化序列化将是:

class ContextSerializer 
{ 
    public void SaveProduct(Product prod) 
    { 
     using(IContext context = IoC.GetInstance<IContext>()) 
     { 
      context.Save(prod); 
     } 
    } 
} 

用法是:

public void SaveNewProduct(string code) 
{ 
    var prod = new Product() { Code = code }; 
    var contextSerializer = new ContextSerialzer(); 
    contextSerializer.SaveProduct(prod); 
} 

这可以防止对象持有上下文(在您的示例中的字段),并保持您的业务对象si mple。它也分担关注。

如果你进入,你在你的业务对象有继承的情况下,考虑Visitor Pattern

+0

如果我想使用延迟加载与相关的业务对象(如产品有零件列表),这不是我想的选择吗?不,我有依赖上下文字段实施延迟加载.... – Harza 2012-05-14 10:24:28

+0

我也标记了这一点,因为我也计划以各种方式坚持对象,这似乎是非常好的选择,但这个懒加载.... – Harza 2012-05-14 10:26:24

+0

我不知道延迟加载的通用方法,它确实取决于您的用例。 – 2012-05-25 05:50:28