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 サービスを実装するとき、サービス コントラクトとデータ コントラクトを定義する必要があります。問題は、この 2 つは現在のモデルとリポジトリの正確な複製であるため、何をすべきかよくわかりません。

これは私がこれまでに持っているものですが、これが正しい方法であるかどうかはわかりません:

[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 プロジェクトで、この 2 つのクラスの複製を作成する必要がありますか?

4

1 に答える 1

2

さて、WCF サービスを実装する際に理解しておくべきことがあります。クライアントとサービスの間でデータのみをメッセージで送信しますが、クラスとインターフェイスの実装は送信しません。サービスの使用を開始する前に記述する必要があります。適切にセットアップするには、a )サーバー側で ServiceContract を作成するb ) クライアント側でそれをマージする必要があります。これを行うと、サービスはコントラクト インスタンスのデータをサーバー側のメッセージに配置し、メッセージからこのデータを取得してクライアント側でコントラクト インスタンスを作成する方法を認識します。

送信するデータが標準の .NET オブジェクト (シリアル化できる) である場合、サーバーとクライアントの両方がその構造を認識し、それを操作できます。ただし、それが独自のクラスである場合は、クライアントがメッセージからこのクラスのインスタンスを作成する方法を理解できるように、DataContract として作成する必要があります。

はい、ServiceContract メソッドで Book クラスを使用する場合は、DataContract としてマークする必要があります。ただし、複製を作成する必要はありません。あなたのサービスはそれを見るだけでよく、[DataContract] 属性でマークする必要があります。これにより、svcutil などでクライアントからサービスへの参照を作成するときに、クライアント側に同じ Book クラスが作成されます。このクラスの構造は、データ契約とそのデータメンバーに従います。

于 2013-03-29T08:19:11.440 に答える