3

所以我正在尝试创建一个适配器,其中适配器从它尝试模拟的类继承。构造函数采用将被调整的类的实例,然后映射属性,以便两者相互传递信息,我认为这是非常标准的。但是,其中一个成员恰好是另一种类型的列表,也必须进行调整。这个有模式吗??

这是一个例子:

public class Contract.ClassA
{
    public List<Contract.ListMemberClass> Members { get; set; }
}

public class Domain.ClassA
{
    public List<Domain.ListMemberClass> Members { get; set; }
}

public class Contract.ListMemberClass
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Domain.ListMemberClass
{
    public string FName { get; set; }
    public string LName { get; set; }
}

// adapters

public class DomainClassAdapter : Domain.ClassA
{
    private readonly Contract.ClassA _input;

    public DomainClassAdapter(Contract.ClassA input)
    {
        _input = input;
    }

    public List<Domain.ListMemberClass> Members {
    {
        get
        {
            // ???
        }
        set
        {
            // ???
        }
    }
}

所以我对 getter 的第一直觉是为该列表成员创建另一个适配器,新建并返回它。然后为二传手朝另一个方向做同样的事情。所以我最终可能会得到无数个适配器。

这是做到这一点的唯一方法,还是有其他模式、技巧、技术等来解决这种情况?

4

1 回答 1

0

Domain.ListMemberClass对我来说,有一个适配器似乎是合理的。但是,我真的不知道有什么模式。

假设您在进行服务器调用时只需要在DomainContract命名空间之间进行转换,我实际上建议将行为放在构造函数中并让属性自动实现。

public DomainClassAdapter(Contract.ClassA input)
{
  _input = input;
  this.Members = _input.Members.Select(x => new DomainListMemberAdapter(x));
}

如果您不想从适配器中创建一堆混乱,那么Domain.ListMemberClass在 LINQ 语句中创建实例而不是适配器实例就足够简单(尤其是只有两个属性)。

如果您不想调用可能很昂贵的构造函数,则可以为该属性执行缓存方法:

private List<Domain.ListMemberClass> _members;
public List<Domain.ListMemberClass> Members {
{
  get
  {
    if(_members == null)
    {
      // Populate _members from _input
    }
    return _members;
  }
  set
  {
    // No special behavior necessary, I think
  }
}

这两个示例都假定您将调用一些方法,该方法将Contract在必要时将所有内容转换为命名空间模型。不过,我有点担心我可能错过了适配器模式的要点,所以请让我知道我是否确实错过了要点。

于 2013-10-21T17:28:30.330 回答