gpt4 book ai didi

c# - WCF - 使用完全相同的数据契约(Contract)的多个服务契约(Contract)

转载 作者:太空狗 更新时间:2023-10-29 20:22:00 24 4
gpt4 key购买 nike

我有一个新问题要问 WCF 专家。

所以,我有一个类 User这接近于我用于数据库操作的数据库中的“用户”表示。现在,我想有 2 个不同的服务契约(Contract)使用这个类作为数据契约(Contract),但每个都有自己的方式......我的意思是,

public class DBLayer
{
void InsertUsers(List<User> userList)
{
// both 'PropertyVisibleForService1' and 'PropertyVisibleForService2'
// are used HERE to be inserted into their columns
}
}

[DataContract]
public class User
{
[DataMember] public string PropertyVisibleOnlyForService1{...}
[DataMember] public string PropertyVisibleOnlyForService2{...}
}

[ServiceContract]
public interface IService1
{
List<User> GetUsers(); // user with 'PropertyVisibleOnlyForService1' inside
}

[ServiceContract]
public interface IService2
{
List<User> GetUsers(); // user with 'PropertyVisibleOnlyForService2' inside
}

因此,我们的想法是每项服务将获得不同类型的用户,即 'User' 的子集.请记住,我想使用 'User'与数据库操作一样,我可以选择什么来实现这一目标?我真的需要创建不同的数据契约(Contract)还是有其他更智能的方法?

最好不仅给我解决方案,还要向我解释一些最佳实践和备选方案。

提前谢谢你。

编辑1:我在这里添加了一个虚拟 DBLayer 类,以便更好地了解以及为什么我认为在这种情况下继承可能不好。

解决方案是使用另一个 ' UserForService1 ' 和 ' UserForService2 '作为数据契约(Contract),它会在末尾从/映射到'User ’但我想要一些其他的观点。

EDIT2:非常好的文章在这种情况下对我有帮助:http://bloggingabout.net/blogs/vagif/archive/2009/03/29/iextensibledataobject-is-not-only-for-backward-compatibility.aspx

最佳答案

您可以为每个服务创建单独的 DTO,但您的情况实际上是 Decorator pattern 的理想选择:

[DataContract]
public class UserForService1 : User
{
private User mUser;
public UserForService1(User u)
{
mUser = u;
}

//expose only properties you'd like the user of this data contract to see
[DataMember]
public string SomeProperty
{
get
{
//always call into the 'wrapped' object
return mUser.SomeProperty;
}
set
{
mUser.SomeProperty = value;
}
}
// etc...
}

对于 Service2 类似的代码,它只公开你关心的内容......

关于c# - WCF - 使用完全相同的数据契约(Contract)的多个服务契约(Contract),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5913177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com