我从外部库中检索一个对象,稍后我需要将该对象返回给库。这是一个例子:
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 或类适配器模式,但这不起作用,因为我无法将外部用户转换为内部类适配器,即。不能将猫变成狗只是因为它们都是动物。
我该如何解决这个问题? 我会喜欢一些解决这个问题的博客,文章或书籍参考
答案 0 :(得分:1)
我假设您将代码编写为服务,因此解耦完全正确。我担心只有两种方法可以将代码与第三方完全分离。
您的班级字段可以完全匹配第三方字段,否则您无法在将用户对象添加到团队之前重新构建用户对象。这当然是你想要避免的问题。
另一种方法是让你的用户包装器包含足够的信息,以便在添加到团队之前吸引用户和团队。
我将在下面的代码中演示使用辅助类转换回和第四个以及一些假设:
助手等级(替换:
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;
}
}