设计模式 - 脂肪适配器



我们已经实现了适配器设计模式,其作业为以下:

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

项目#3开始让我担心,因为适配器变得比我最初想象的要复杂。我不知道设计模式可以修剪适配器。有一个吗?建议?

您已经使用了我喜欢称为"瑞士军刀"图案的东西。

  • 点1是 broker模式(或类似)
  • 点2是适配器模式(或类似)
  • 点3是基于内容的路由(或类似)

最佳实践说,您应该将班级分成至少3堂课,每次都有一个。

而不是使用适配器或完整存储库(CRUD操作),我将使用IREADER接口进行读取和访问者模式进行插入更新删除,因此您可以将域逻辑与Infraestructure分开(持久性)细节,这是一个想法:

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

下一步可能是添加仿制药供阅读和访问者。在这种情况下,您最终几乎没有很小的类别,并获得灵活性以及诸如单一责任,接口隔离等牢固原则的好处。因此,您可以创建一个丰富的封装域,并通过一些荒凉的原理扩展其功能。问候!

最新更新