以正确的方式实现wcf服务

时间:2013-03-29 07:36:25

标签: c# wcf

您好我正在学习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项目中为这两个类创建重复项,只是从存储库中调用方法?

1 个答案:

答案 0 :(得分:2)

嗯,有一件事你应该理解,实现你的WCF服务 - 它只在你的客户端和服务之间发送消息中的数据,但不是你的类和接口的实现,您应该在开始使用服务之前描述。要正确设置,您必须 a )在服务器端创建一个ServiceContract b )在客户端合并它。执行此操作后,您的服务将知道如何将合同实例的数据放入服务器端的消息中,并从消息中获取此数据并在客户端创建合同实例。

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

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