如何适应和适应外部环境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-Adapter 或 Class 适配器模式,但没有用,因为我无法将外部用户转换为内部 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());
希望这能让你进入
我从外部库中检索了一个对象,稍后我需要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-Adapter 或 Class 适配器模式,但没有用,因为我无法将外部用户转换为内部 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());
希望这能让你进入