#.net #wcf #mvp
#.net #wcf #mvp
Вопрос:
Я новичок в WCF, и я также изучаю шаблон проектирования MVP. У меня есть тестовый проект с работающей службой WCF. Я могу протестировать с помощью тестового клиента WCF, и он работает нормально.
Мне нужна помощь в том, как вызвать службу WCF с моего уровня презентатора, а затем попросить презентатора передать данные обратно в представление (winforms). У меня есть форма Windows с двумя текстовыми полями с именами txtProductID и txtDescription. У меня также есть кнопка с именем btnGetProductData. Я хотел бы, чтобы произошло следующее:
- Я введу идентификатор продукта в поле txtProductID.
- Я нажму кнопку btnGetProductData, и докладчик должен вызвать метод GetProductData из службы WCF и вернуть описание продукта в поле txtProductDescription в моей форме.
Вот соответствующий код из библиотеки служб WCF:
IProductService.cs
------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace MyWCFServices.ProductService
{
[ServiceContract]
public interface IProductService
{
[OperationContract]
Product GetProductData(string ProductId);
}
[DataContract]
public class Product
{
[DataMember]
public string ProductID { get; set; }
[DataMember]
public string ProductDescription { get; set; }
}
}
ProductService.cs
--------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using MyWCFServices.ProductEntities;
using MyWCFServices.ProductBusinessLogic;
namespace MyWCFServices.ProductService
{
public class ProductService : IProductService
{
ProductLogic productLogic = new ProductLogic();
public Product GetProductData(string ProductId)
{
ProductEntity productEntity = productLogic.
GetProductData(ProductId);
Product product = new Product();
TranslateProductEntityToProductContractData(productEntity,
product);
return product;
}
private Product TranslateProductEntityToProductContractData(
ProductEntity productEntity, Product product)
{
product.ProductID = productEntity.ProductID;
product.ProductDescription = productEntity.ProductDescription;
return product;
}
}
}
Комментарии:
1. Ваша служба выглядит нормально, но с какой конкретно проблемой вы столкнулись на клиенте? НАПРИМЕР: у вас возникли проблемы с созданием прокси, возвращает ли он не то, что вы ожидаете?
Ответ №1:
Я не уверен, в чем у вас возникли проблемы, поэтому я начну с самого начала.
- Вам необходимо добавить «Ссылку на службу» в ваш проект уровня презентации (это генерирует прокси-класс, который вы можете использовать для вызова своей службы).
- Вам необходимо создать экземпляр сгенерированного прокси-класса
- Вам нужно вызвать метод в классе прокси и сохранить его значение
В Visual Studio щелкните правой кнопкой мыши свой проект и выберите «Добавить ссылку на службу», а затем перейдите к конечной точке для вашей службы.
Пример кода:
// Presentation Tier (button event handler)
var proxy = new ServiceReference1.ProductServiceClient();
var prod = proxy.GetProductData("yourProductID");
txtDescription.Text = prod.Description;
txtProductID.Text = prod.ProductID; // same as passed parameter
Комментарии:
1. Вы все равно добавили бы ссылку на службу через Visual Studio, потому что это не имеет никакого отношения к используемой вами модели программирования. Один из самых простых способов для новичка в WCF использовать его в клиенте WinForms — создать и использовать экземпляр прокси в коде формы.
2. спасибо за ваш ответ и пример. У меня есть вопрос относительно вашего ответа. Поскольку я использую шаблон проектирования представления модели Presenter и моему классу Prensenter необходимо вызвать службу WCF, буду ли я по-прежнему добавлять ссылку на службу через Visual Studio? -ИЛИ- Я должен делать это, как показано в примере кода, который я нашел ниже? Примечание: ProductService — это имя класса службы WCF. ProductService Служба продуктов; ProductService
3. Да, вам все еще нужно добавить ссылку на службу, чтобы использовать прокси-класс, который я определил выше и который вы пытаетесь использовать в коде, который вы только что опубликовали.
4. Первые два комментария выше не в порядке из-за моих неуклюжих попыток объединения и редактирования. Похоже, что нет способа заставить их отображаться в правильном порядке.