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

因此,我有一个User类,它与我用于数据库操作的DB的“用户”表示形式非常接近。现在,我希望有2个不同的服务契约(Contract),这些服务契约(Contract)使用此类作为数据契约(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”作为数据协定,这些协定将在最后从“User”映射到“ojit_code”中,但我需要其他一些观点。

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/

10-11 08:08