我有这个场景,我有一个基类Book,它有两个孩子FictionBook和NonFictionBook,它们都覆盖了ToString方法。目前,这些类在WCF服务解决方案中,并且我在客户端上获得了一个书籍列表(List),但是,在尝试使用子类的.ToString()方法时,我陷入困境。
这是来自客户的代码:
BookServiceClient bookService = new BookServiceClient("BasicHttpBinding_IBookService");
List<Book> matchingBooks = new List<Book>();
matchingBooks = (bookService.SearchBookByTitle(upperBookTitle)).ToList();
if (matchingBooks.Count > 0)
{
int count = 1;
foreach (Book book in matchingBooks)
{
Console.WriteLine("Matching Book " + count + ": " + book.ToString());
count++;
}
} else
{
Console.WriteLine("No matching books found");
}
这是Service中的一个子类,它覆盖了ToString方法。另一个子类NonFictionBook也覆盖了ToString方法,需要从客户端访问:
namespace BookModels
{
[DataContract]
class FictionBook : Book
{
[OperationContract]
public override string ToString()
{
return string.Format("Title: {0}, ISBN: {1}, Author: {2}", title, isbn, author);
}
}
}
因此,简而言之,我想从调用服务的客户端访问ToString方法。
实现这一目标的最佳解决方案是什么?
答案 0 :(得分:1)
从WCF服务中取出模型.....。您的应用程序和WCF服务是否继承了Book类所在的库。以这种方式使用它。
答案 1 :(得分:0)
<强> 1。正如TheGeekYouNeed所说,你需要共享一个图书馆
在客户端和服务器之间。
<强> 2。但是你还需要在基类上设置多态性
否则您将获得CommunicationException
设置多态性可以序列化派生类型 这意味着可以序列化的派生类在基类上声明。
[DataContract]
[KnownType(typeof(FictionBook))]
[KnownType(typeof(NonFictionBook))]
public abstract class Book
第3。然后,您可以将服务器与ChannelFactory<T>
IBookService client = ChannelFactory<IBookService>.CreateChannel(
new BasicHttpBinding(),
new EndpointAddress("http://localhost:8733/Design_Time_Addresses/BookService/")
);
List<Book> books = client.GetBooks();
foreach (var book in books)
Console.WriteLine(book);
你可以这样做,因为服务器和客户端共享一个可以放置接口的库 好的,在&#34;之间共享一个库不是SOA&#34; 但它的优点是,当更改接口时,未更改的端(客户端或服务器)上存在编译错误 [在理想世界中确定 - 接口应该是不可变的;-)]
此致