繁体   English   中英

设计模式-胖适配器

[英]Design Pattern - Fat adapter

我们已经实现了适配器设计模式,其工作如下:

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

随着适配器变得比我最初想象的要复杂,第3项开始让我担心。 我不知道用于精简适配器的设计模式。 有一个吗? 有什么建议吗?

您使用了我喜欢的“瑞士军刀”模式。

最佳做法是,您应该将您的课程至少分为3个班级,每个问题一个班级。

而不是使用适配器或完整的存储库(CRUD操作),我将使用IReader接口进行读取,并使用访问者模式进行插入更新删除,因此您可以将域逻辑与基础结构(持久性)详细信息分开,这是这样的想法:

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);
    }
}

下一步可能是添加阅读和访问者的泛型。 在这种情况下,您最终只剩下很少的类,并且获得了灵活性以及诸如单一职责,接口隔离等坚实原则的好处。因此,您可以创建一个丰富的封装域并使用某些设计原则来扩展其功能。 问候!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM