2013-03-29 37 views
2

嗨,我只是學習WCF,我正在嘗試在我正在開發的一個虛擬項目上實現WCF服務,而我正在做這個工作。以正確的方式實現wcf服務

我的項目中包含有一個實體框架資源庫是resposible用於在database accesing數據是怎樣的模式和界面看起來像一個數據訪問項目:

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); 
} 

這是一個好的IDEEA移動的模型和信息庫到WCF服務?

或者我應該在我的wcf項目中爲這兩個類創建重複項,只調用存儲庫中的方法?

回答

2

好,還有就是你應該明白,實現您的WCF服務的東西 - 它會將您的郵件客戶端和服務之間只有數據,但不是你的類和接口的實施,你應該描述在你開始消耗你的服務之前。要正確設置它,你必須a)在你的服務器端做一個ServiceContract b)將它合併到你的客戶端。完成此操作後,您的服務將知道如何將合同實例的數據放入服務器端的消息中,並從消息中獲取此數據並在客戶端創建合同實例。

如果您發送的數據是標準.NET對象(可以序列化),則服務器和客戶端都會知道其結構,並且能夠使用它。但如果它是你自己的類 - 你必須把它作爲DataContract,這樣客戶端才能理解如何從消息中創建這個類的實例。

所以,是的,如果您在ServiceContract方法中使用Book類,則應將其標記爲DataContract。但是你不必創建它的dublicate。您的服務只能看到它,並且必須標記[DataContract]屬性。通過這樣做,當你創建客戶端到服務的引用(例如svcutil)時,它將在客戶端創建相同的Book類。這個類的結構將遵循你的數據合同和它的數據成員。