gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:24 25 4
gpt4 key购买 nike

您好,我正在学习 WCF,我正在尝试在我正在从事的虚拟项目上实现 WCF 服务,我想正确地做到这一点。

我的项目包含一个 DataAccess 项目,该项目具有一个 Entity Framework 存储库,负责访问数据库中的数据。模型和接口(interface)如下所示:

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 服务时,我必须定义服务契约(Contract)和数据契约(Contract)。问题是这两个是我当前模型和存储库的完全副本,所以我不确定该怎么做。

这是我目前所拥有的,但我不确定这是正确的方法:

[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 项目中为这两个类创建副本,它们只调用存储库中的方法吗?

最佳答案

好吧,有一点您应该了解,实现您的 WCF 服务 - 它仅在消息中在您的客户端和服务之间发送数据,而不是您的类和接口(interface)的实现,您应该在开始使用您的服务之前对其进行描述。要正确设置它,您必须a) 在您的服务器端创建一个 ServiceContract b) 在您的客户端合并它。完成此操作后,您的服务将知道如何将契约(Contract)实例的数据放入服务器端的消息中,以及如何从消息中获取此数据并在客户端创建契约(Contract)实例。

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

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

关于c# - 以正确的方式实现 wcf 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15699247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com