【问题标题】:How do you 'adapt' a class member that is a collection?您如何“适应”作为集合的类成员?
【发布时间】:2013-10-21 17:21:48
【问题描述】:

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

这是一个例子:

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 的第一反应是为该列表成员创建另一个适配器,新建并返回它。然后为二传手朝另一个方向做同样的事情。所以我最终可能会得到无数个适配器。

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

【问题讨论】:

  • 适配器是否也负责将事物返回到 Contract 命名空间模型?
  • 不一定非得是同一个适配器,但那将是下一步,是的。

标签: c# .net adapter


【解决方案1】:

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

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

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

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

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

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 命名空间模型。不过,我有点担心我可能错过了适配器模式的要点,所以如果我确实错过了要点,请告诉我。

【讨论】:

  • 是的,我想我们确实有点想念那个。我试图避免从适配器到映射器的交叉。可能唯一的选择是为所有内容创建适配器,或者通过 linq 构建它们。我不喜欢这两种选择,所以我希望有一些我不知道的东西会是神奇的解决方案。也可能是我需要重新评估这个练习的目的。
  • 是的,我认为最大的挑战是,一旦你传回List&lt;Domain.ListMemberClass&gt;,它就是一个新列表,所以像Add() 这样的东西不会神奇地将东西转移到保存在Contract 的副本中DomainClassAdapter。我认为您必须编写一个也实现 IList 的适配器才能使其正常工作。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2021-11-16
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多