2016-12-05 73 views
0

我们已经实现了适配器的设计模式,他们的工作是:设计模式 - 脂肪适配器

  1. 充当服务和数据访问层之间的联络人。
  2. 将原始数据(从数据源,内部或外部)转换为域特定数据。做必要的验证和按摩。
  3. 有时,进行DAO调用可能取决于输入参数中不容易获得的数据,也可能需要根据输入数据进行额外的服务调用。换句话说,适配器不能总是在服务和DAO之间进行1:1映射。它可以根据输入参数将来自服务的相同呼叫映射到不同的DAO呼叫。

项目#3开始让我担心,因为适配器变得比我原先想象的更加复杂。我不知道设计模式是否需要修剪适配器。有一个吗?建议?

回答

1

你已经使用了我喜欢称之为“瑞士军刀”的模式。

最佳实践说,你应该改掉上课至少3个班级,每个班级需要一个班级。

+0

我认为在分离1和2时没有任何价值。2层之间的接口必须将数据转换为数据的代码,这是给定的。即使在GOF中,他们也这样做,我认为这不是经纪人模式,也许因为它与适配器没有区别。 3是我所关心的,我在我的问题中说过。 –

+0

@Abhi在分离1和2时通常有价值,而且我在很多场合都做到了这一点。 1和2实际上几乎无关。但是你正处于决定的最佳位置。只要你考虑你的决定,并且可以向想要知道你为什么做出改变的人解释它,那就没问题。最糟糕的情况是你以后需要做更多的工作。巴斯特案,这一切都有效,每个人都很开心。 – Bohemian

-2

而不是使用适配器或完整的存储库(CRUD操作),我会使用一个IReader接口读取和访问模式插入更新删除,所以你可以分离领域逻辑从infraestructure(persistance)细节,这是理念:

public class MyBusinessObject : IAcceptBusinessVisitor, IAcceptMyBusinessIdVisitor 
{ 
    private readonly string _id; 

    private string MyPrivateProp { get; set; } 
    //Fully encapsulated object 
    public MyBusinessObject(string id, string myPrivateProp) 
    { 
     _id = id; 
     MyPrivateProp = myPrivateProp; 
    } 

    public void UpdateMyProp(string newProp) 
    {    
     if (string.IsNullOrWhiteSpace(newProp)) throw new ArgumentNullException(nameof(newProp)); 
     //Business rules ... 
     MyPrivateProp = newProp; 
    } 

    public void Accept(IMyBusinessObjectVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id, MyPrivateProp); 
    } 

    public void Accept(IMyBusinessIdVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id); 
    } 
} 

public interface IAcceptBusinessVisitor 
{ 
    void Accept(IMyBusinessObjectVisitor visitor); 
} 

public interface IAcceptMyBusinessIdVisitor 
{ 
    void Accept(IMyBusinessIdVisitor visitor); 
} 

public interface IMyBusinessObjectVisitor 
{ 
    void Visit(string id, string prop); 
} 

public interface IMyBusinessIdVisitor 
{ 
    void Visit(string id); 
} 

public class SavePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Save to Database 
    } 
} 

public class UpdatePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Update to Database 
    } 
} 

public class DeleteVitor : IMyBusinessIdVisitor 
{ 
    public void Visit(string id) 
    { 
     //Delete in Database 
    } 
} 

这里阅读:

public interface IMyBusinessObjectReader 
{ 
    MyBusinessObject Read(string id); 
} 

class MyBusinessObjectReaderFromDb : IMyBusinessObjectReader 
{ 
    public MyBusinessObject Read(string id) 
    { 
     //Read from database 
     string myPrivateProp = ""; 
     return new MyBusinessObject(id, myPrivateProp); 
    } 
} 

下一步可能是添加泛型读取和游客。在这种情况下,您最终会得到很小的类,并获得灵活性,以及​​像单一响应性,接口隔离等固体原理的好处。因此,您可以创建一个丰富的封装域并使用一些设计原则扩展其功能。 关心!

+1

我很欣赏你花时间,但我不认为你的答案是相关的。首先,我没有提及任何有关CRUD的内容。实际上,就我而言,只有各种读取方法。其次,访问者模式的目的是在有明确的层次结构时使用,并且需要添加一个新的方法,该方法不适用于层次结构中的所有类,或者添加它对层次结构是破坏性的,其中没有一个与我在文章中描述的问题有关。 [这里](https://www.cs.virginia.edu/~horton/cs4240/slides/files/visitor.pdf)是访客模式的一个很好的例子 –