如何适应和适应外部环境class

How to adapt to and from an external class

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

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 实现了比我想要的大得多的外部接口。

我也尝试过 N-Way-AdapterClass 适配器模式,但没有用,因为我无法将外部用户转换为内部 class 适配器,即。不能因为猫都是动物就把猫变成狗。

我该如何解决这个问题? 我想要一些解决这个问题的博客、文章或书籍参考

为什么你不能这样做?

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

我假设您将代码编写为服务,因此解耦完全有意义。恐怕只有两种好方法可以将您的代码与第三方的代码完全解耦。

一个是您的 class 字段与第三方字段完全匹配,否则您将无法在将用户对象添加到团队之前重建它。这当然正是您所说的要避免的问题。

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

我将在下面的代码中使用辅助程序 class 进行向后和第四次转换以及一些假设进行演示:

  • dao.GetUser() 创建一个新用户
  • dao.GetUser(int) 会通过 id
  • 找到现有用户
  • dao.GetTeam(string) 按名称查找团队
  • dao.GetTeam(int) 通过 id
  • 找到一个团队

助手Class(替换:

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

非常薄class适合您的对象:

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

希望这能让你进入