2

嗨,我刚刚学习 WCF,我正在尝试在我正在从事的虚拟项目上实现 WCF 服务,我希望这样做是正确的。

我的项目包含一个 DataAccess 项目,该项目具有一个实体框架存储库,可用于访问数据库中的数据。模型和接口如下所示:

public partial class BookModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }
    public string Description { get; set; }
    public DateTime PublicationDate { get; set; }
    public int CategoryId { get; set; }
    public decimal Price { get; set; }
    public string BookUrl { get; set; }
}

public interface IBookRepository
{
    IEnumerable<BookModel> GetBooks(int pageNumber, int numberOfBooksOnPage);
    IEnumerable<BookModel> GetBookByCategory(int categoryId, int pageNumber, int numberOfBooksOnPage);
    BookModel GetBookById(int bookId);
    int CountBooks();
    int CountBooksByCategory(int categoryId);
    void AddBook(BookModel book);
    void UpdateBook(BookModel book);
    void DeleteBook(int bookId);
}

现在,当我实现 wcf 服务时,我必须定义服务合同和数据合同。问题是这两个是我当前模型和存储库的完全相同的副本,所以我不确定该怎么做。

这是我到目前为止所拥有的,但我不确定这是正确的方法:

[DataContract]
public class Book
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Author { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public DateTime PublicationDate { get; set; }

    [DataMember]
    public int CategoryId { get; set; }

    [DataMember]
    public decimal Price { get; set; }

    [DataMember]
    public string BookUrl { get; set; }
}

[ServiceContract]
interface IBookService
{
    [OperationContract]
    IEnumerable<Book> GetBooks(int pageNumber, int numberOfBooksOnPage);

    [OperationContract]
    IEnumerable<Book> GetBookByCategory(int categoryId, int pageNumber, int numberOfBooksOnPage);

    [OperationContract]
    Book GetBookById(int bookId);

    [OperationContract]
    int CountBooks();

    [OperationContract]
    int CountBooksByCategory(int categoryId);

    [OperationContract]
    void AddBook(Book book);

    [OperationContract]
    void UpdateBook(Book book);

    [OperationContract]
    void DeleteBook(int bookId);
}

将模型和存储库移动到 wcf 服务中是一个好主意吗?

或者我应该在我的 wcf 项目中为这两个类创建重复项,只从存储库中调用方法?

4

1 回答 1

2

好吧,您应该了解一件事,实现您的 WCF 服务 - 它仅在您的客户端和服务之间以消息的形式发送数据,而不是您的类和接口的实现,您应该在开始使用服务之前对其进行描述。要正确设置它,您必须a)在服务器端创建 ServiceContract b)在客户端合并它。完成此操作后,您的服务将知道如何将合同实例的数据放入服务器端的消息中,并从消息中获取此数据并在客户端创建合同实例。

如果您发送的数据是标准的 .NET 对象(可以序列化),服务器和客户端都将知道它的结构,并且能够使用它。但如果它是您自己的类 - 您必须将其设为 DataContract,以便客户端了解如何从消息中创建此类的实例。

所以,是的,如果您在 ServiceContract 方法中使用 Book 类,它应该被标记为 DataContract。但是你不必创建它的副本。您的服务只需看到它,并且必须使用 [DataContract] 属性对其进行标记。通过这样做,当您创建从客户端到您的服务的引用时,例如通过 svcutil,它将在您的客户端创建相同的 Book 类。此类的结构将遵循您的数据合同及其数据成员。

于 2013-03-29T08:19:11.440 回答