如何适应和来自外部阶级

时间:2016-06-13 13:51:29

标签: c# design-patterns adapter

我从外部库中检索一个对象,稍后我需要将该对象返回给库。这是一个例子:

var user = dao.GetUser();
var team = dao.GetTeam();
team.Add(user);

我已经尝试了以下内容:

  • 适配器外部 - >内部
  • 适配器内部 - >外部

看起来像这样:

var user = new UserAdapter(dao.GetUser());
var team = new TeamAdapter(dao.GetTeam());
team.Add(new ExternalUserAdapter(user));

问题是,我的内部界面现在必须提供我不需要的大量方法,因为ExternalUserAdapter实现的外部接口比我想要的要大得多。< / p>

我还尝试了 N-Way-Adapter 类适配器模式,但这不起作用,因为我无法将外部用户转换为内部类适配器,即。不能将猫变成狗只是因为它们都是动物。

我该如何解决这个问题? 我会喜欢一些解决这个问题的博客,文章或书籍参考

2 个答案:

答案 0 :(得分:1)

我假设您将代码编写为服务,因此解耦完全正确。我担心只有两种方法可以将代码与第三方完全分离。

您的班级字段可以完全匹配第三方字段,否则您无法在将用户对象添加到团队之前重新构建用户对象。这当然是你想要避免的问题。

另一种方法是让你的用户包装器包含足够的信息,以便在添加到团队之前吸引用户和团队。

我将在下面的代码中演示使用辅助类转换回和第四个以及一些假设:

  • dao.GetUser()创建新用户
  • dao.GetUser(int)将按ID
  • 查找现有用户
  • dao.GetTeam(字符串)按名称找到一个团队
  • dao.GetTeam(int)按ID
  • 找到一个团队

助手等级(替换:

public static class ThirdPartyHelpers
  {
    private static readonly ThirdParty.Dao dao = new ThirdParty.Dao();

    public static ThirdParty.User GetUser()
    {
      return dao.GetUser();
    }

    public static ThirdParty.Team GetTeam()
    {
      return dao.GetTeam();
    }

    public static User Decoupled(this ThirdParty.User user)
    {
      var myUser = new User();
      myUser.Id = user.Id;
      myUser.Name = user.FirstName + " " + user.LastName;

      return myUser;
    }

    public static ThirdParty.User ToThirdParty(this User user)
    {
      var thierUser = dao.GetUser(user.Id);
      return thierUser;
    }

    public static Team Decoupled(this ThirdParty.Team team)
    {
      var myTeam = new Team();
      myTeam.Id = team.Id;
      myTeam.Name = team.Name;

      return myTeam;
    }

    public static ThirdParty.Team ToThirdParty(this Team team)
    {
      var theirTeam = dao.GetTeam(team.Id);
      return theirTeam;
    }
  }

对象的非常薄的类:

 public class Team
  {
    public int Id { get; set; }
    public object Name { get; set; }
  }

  public class User
  {
    public int Id { get; set; }
    public string Name { get; set; }
  }

然后你的代码看起来像这样:

  var user = ThirdPartyHelpers.GetUser().Decoupled();
  var team = ThirdPartyHelpers.GetTeam().Decoupled();

  team.ToThirdParty().Add(user.ToThirdParty());

希望这会让你进入

答案 1 :(得分:0)

为什么不能这样做?

    var user = dao.GetUser() as IUserAdapter;
    var team = dao.GetTeam() as ITeamAdapter;
    team.Add(user as TheActualUnderlyingClassReturnedFromGetUser);

您当然需要定义IUserAdapter和ITeamAdapter接口,但不必编写任何代码或为您不使用的方法编写任何功能签名。

在我的脑屁后编辑:

public class UserAdapter
{
    public ExternalUser refToUser {get; private set;}
    //expose the methods you need here
    //eg:
    public void SomeMethod(int someParameter)
    {
        refToUser.SomeMethod(someParameter);
    }
    public UserAdapter(ExternalUser usr)
    {
    refToUser = usr;
    }
}