您好我正在学习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项目中为这两个类创建重复项,只是从存储库中调用方法?
答案 0 :(得分:2)
嗯,有一件事你应该理解,实现你的WCF服务 - 它只在你的客户端和服务之间发送消息中的数据,但不是你的类和接口的实现,您应该在开始使用服务之前描述。要正确设置,您必须 a )在服务器端创建一个ServiceContract b )在客户端合并它。执行此操作后,您的服务将知道如何将合同实例的数据放入服务器端的消息中,并从消息中获取此数据并在客户端创建合同实例。
如果您发送的数据是标准.NET对象(可以序列化),则服务器和客户端都将知道其结构,并且能够使用它。但如果它是你自己的类 - 你必须将它作为DataContract,以便客户端能够理解如何从消息中创建这个类的实例。
所以,是的,如果你在ServiceContract方法中使用Book类,它应该被标记为DataContract。但你不必创建它的dublicate。您的服务只需要查看它,并且必须使用[DataContract]属性进行标记。通过这样做,当您创建从客户端到服务的引用时,例如通过svcutil,它将在您的客户端创建相同的Book类。此类的结构将遵循您的datacontract及其数据库。