2

我正在尝试创建一个 wcf 数据服务,我不想访问数据库模型,而是想使用数据传输对象。我在互联网上阅读了很多关于如何实现这一点的信息,但我无法为我的问题找到一个好的答案。这是我第一次使用 wcf 数据服务做一些事情,所以我有点缺乏经验。

好的,这是我使用实体框架链接到我的数据库的模型

public class User
    {
        [Key]
        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }

        public string CountryCode { get; set; }
        public string PhoneNumber { get; set; }
        public ICollection<User> Contacts { get; set; }

        public virtual Language Language { get; set; }

        public User()
        {
            Contacts = new List<User>();
        }
    }

public class Message
    {
        [Key]
        public int MessageId { get; set; }
        public DateTime SentDate { get; set; }

        public virtual User Sender { get; set; }
        public virtual User Receiver { get; set; }

        public string Content { get; set; }

        public string OriginalCultureInfoEnglishName { get; set; }
        public string ForeignCultureInfoEnglishName { get; set; }
    }

public class Language
    {
        [Key]
        public int LanguageId { get; set; }
        public string CultureInfoEnglishName { get; set; }
    }

现在我制作了一个包含我的 DatabaseContext 的 Service.svc,因此它可以直接访问我的数据库模型。我想要实现的是,当我查询我的服务时,我想获取 DTO 模型,而不是直接获取数据库模型。

我的 dto 的外观示例

public class UserDTO
    {
        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Country { get; set; }
        public string PhoneNumber { get; set; }

        public ICollection<ContactDTO> Contacts { get; set; }

        public virtual LanguageDTO Language { get; set; }

        public UserModel()
        {
            Contacts = new List<ContactDTO>();
        }
    }

public class ContactDTO
    {
        public int UserId { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }

        public string Country { get; set; }
        public string PhoneNumber { get; set; }

        public virtual LanguageDTO Language { get; set; }
    }

public class LanguageDTO
    {
        public int LanguageId { get; set; }
        public string CultureInfoEnglishName { get; set; }
    }

public class MessageDTO
    {
        public int MessageId { get; set; }
        public DateTime SentDate { get; set; }

        public virtual ContactDTO Sender { get; set; }
        public virtual ContactDTO Receiver { get; set; }

        public string Content { get; set; }

        public string OriginalCultureInfoEnglishName { get; set; }
        public string ForeignCultureInfoEnglishName { get; set; }
    }

现在是否可以通过创建一个我可以在我的 service.svc 中使用的不同上下文来做到这一点,或者有没有其他方法可以实现这一点?

例如,我想通过 userid 获取 ContactDto,它是一个用户,但属性较少,因为它们在客户端应用程序中不相关。我看到这发生在一个 urihttp://localhost:54895/Service.svc/ContactDto(1)

希望任何人都可以为我解决这个问题,因为这真的很令人沮丧:)

4

1 回答 1

1

我不确定你感兴趣的东西是否可能,确切地说。您希望每种类型有多个实体集(又名MEST),但我不知道它的支持程度。

除此之外,还有关于 DTO 的一般讨论......

如果您使用自定义提供程序,您可以实现自己的IDataServiceMetadataProviderIDataServiceQueryProvider. 当您的服务启动时,您可以调用 IDataServiceMetadataProvider 来控制公开或隐藏哪些实体和属性——包括公开实体上实际不存在的属性。结果是您最终得到了一个 DTO,而无需编写 DTO 类。公开的元数据是 DTO。 是创建您自己的提供程序的好资源。

在您的情况下,这不是 100% 的解决方案,因为您无法选择性地选择何时公开属性以及何时不公开。

希望这可以帮助...

于 2013-05-14T20:12:08.790 回答