Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以正确的方式实现wcf服务_C#_Wcf - Fatal编程技术网

C# 以正确的方式实现wcf服务

C# 以正确的方式实现wcf服务,c#,wcf,C#,Wcf,嗨,我只是在学习WCF,我正试图在一个虚拟项目上实现一个WCF服务,我正在工作,我想这样做是正确的 我的项目包含一个DataAccess项目,该项目有一个实体框架存储库,负责访问数据库中的数据。模型和界面如下所示: public partial class BookModel { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; }

嗨,我只是在学习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);
}
公共部分类图书模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串作者{get;set;}
公共字符串说明{get;set;}
public DateTime PublicationDate{get;set;}
public int CategoryId{get;set;}
公共十进制价格{get;set;}
公共字符串BookUrl{get;set;}
}
公共接口IBookRepository
{
IEnumerable GetBooks(int pageNumber,int numberOfBooksOnPage);
IEnumerable GetBookByCategory(int categoryId、int pageNumber、int NumberOfBookOnPage);
BookModel GetBookById(int bookId);
int CountBooks();
int CountBooksByCategory(int categoryId);
作废帐簿(帐簿范本);
作废更新本(图书模型书);
作废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);
}
[DataContract]
公共课堂用书
{
[数据成员]
公共int Id{get;set;}
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共字符串作者{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
public DateTime PublicationDate{get;set;}
[数据成员]
public int CategoryId{get;set;}
[数据成员]
公共十进制价格{get;set;}
[数据成员]
公共字符串BookUrl{get;set;}
}
[服务合同]
接口IBookService
{
[经营合同]
IEnumerable GetBooks(int pageNumber,int numberOfBooksOnPage);
[经营合同]
IEnumerable GetBookByCategory(int categoryId、int pageNumber、int NumberOfBookOnPage);
[经营合同]
Book GetBookById(int bookId);
[经营合同]
int CountBooks();
[经营合同]
int CountBooksByCategory(int categoryId);
[经营合同]
作废帐簿(帐簿);
[经营合同]
作废更新本(书);
[经营合同]
作废DeleteBook(int bookId);
}
将模型和存储库移动到wcf服务中是一个好主意吗


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

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

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

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