【发布时间】:2011-08-20 06:26:51
【问题描述】:
我有一个新问题要问 WCF 专家。
所以,我有一个类User,它与我用于数据库操作的数据库中的“用户”表示很接近。现在,我想要 2 个不同的服务合同,将此类用作数据合同,但每个服务合同都有自己的方式......我的意思是,
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' 原样用于数据库操作,我有什么选择来实现这一目标?我真的需要创建不同的数据合约还是有其他更智能的方法?
最好的办法是不仅给我解决方案,还给我解释一些最佳实践和替代方案。
提前谢谢你。
编辑1: 我在这里添加了一个虚拟 DBLayer 类以获得更好的概述,以及为什么我认为在这种情况下继承可能不好。
解决方案是使用另一个“UserForService1”和“UserForService2”作为数据合约,它们最终会从/映射到“User”,但我想要一些其他的观点。
EDIT2:非常好的文章在这种情况下对我有帮助:http://bloggingabout.net/blogs/vagif/archive/2009/03/29/iextensibledataobject-is-not-only-for-backward-compatibility.aspx
【问题讨论】:
-
我不是 WCF 专家,所以通过评论建议:听起来你应该有两个派生自 User 的类;一个具有 PropertyVisibleOblyForService1 属性,另一个具有另一个属性。
-
感谢您的回复...所以,您建议将这些属性取出并放入新的派生类中。问题是我希望“用户”类保持不变。
-
是的,我想你理解我的建议。但由于我不是 WCF 专家,而且我不知道您的项目、要求等,我不知道是否可以做您想做的事情,让 User 类保持不变。如果您发布更多详细信息,我可能会有所帮助,或者有更多 WCF 经验的人会参与进来。无论哪种方式都祝您好运!
-
感谢您的参与,欢迎任何 cmets。我知道一种解决方案是创建 2 个不同的数据合同,然后将“用户”映射到适当的数据合同,但对于这种情况来说,这可能是另一种更好的做法。我真的不认为在我的情况下继承会很好。谢谢。
-
好的,所以每个人都提出了同样的建议。也许我对我的要求不够清楚。我不想从“用户”中取出属性并放入其他派生类中,因为这个“用户”(及其属性按原样用于数据库操作)。因此,“PropertyVisibleOnlyForService1”和“PropertyVisibleOnlyForService2”都是用户表中的列。