在具有两个服务的 WCF/MVC 项目上使用"共享"类型("无法从...转换")



我有两个 WCF 服务连接到我的客户端。我想使用从服务 #1 检索的用户对象,并将其用作服务 #2 的参数。这是我的MVC控制器TournamentController.cs代码:

private readonly GCTournamentServiceClient _tournamentClient = new GCTournamentServiceClient();
public ActionResult Join(int id)
{
GCUserServiceClient userClient = new GCUserServiceClient();
// Get current user
var currentUser = userClient.GetUser(0);
if (currentUser != null)
{
// Get selected tournament
var selectedTournament = _tournamentClient.GetTournament(id);
// Check if there are available seats in the tournament
if (selectedTournament.Seats > selectedTournament.RegistredUsers.Count)
{
// Check if user exist amoung registred users
if (!selectedTournament.RegistredUsers.Contains(currentUser))
{
selectedTournament?.RegistredUsers.Add(currentUser);
}
}
}
}

错误Visual Studio提示我:

Argument 1: cannot convert from 'GConnect.Clients.WebClient.GCUserService.User' to 'GConnect.Clients.WebClient.GCTournamentService.User'

所以问题是currentUser,其类型为GCUserService.User。我无法将其用作RegistredUsers的参数

错误本身非常有意义,但是,我不太确定应该如何(正确)转换此类型。一些文章指出,必须创建一个"共享"服务,其中包含用户类型。我简直不敢相信,这样的解决方案应该是必要的。

我可能误解了这里的一些基本内容(使用 WCF 和 MVC),但如果是这种情况,请启发我。

所以问题是当前用户,其类型为GCUserService.User。 我无法将其用作注册用户的参数

有两种方法可以解决此问题:

1)创建一个类库项目 (Visual Studio) 并在该项目中添加User类,编译它并将其程序集的 (.dll) 引用添加到服务和客户端(MVC 应用程序)。接下来检索该用户对象,因为您已经在这样做了

var currentUser = userClient.GetUser(0);

GetUser 将返回在单独程序集中定义的User类型,该程序集作为引用添加,如上所述。TournamentService还将引用相同的程序集,RegistredUsers.Add(User userToadd)方法将采用相同的User对象,WCF 运行时应该能够对其进行序列化/解密。

2)在 MVC 客户端应用程序中,新建TournamentService.RegistredUsers.Add方法可接受的User对象。从currentUser填充其属性,并将该对象作为参数传递给RegistredUsers.Add方法。

最佳实践

理想情况下,我会推荐第一种方法,这种方法工作量更大,但做法更好,并且集中维护您的User类并重用代码。

希望这有帮助!

最新更新