WCF — Вызов службы WCF с уровня докладчика

#.net #wcf #mvp

#.net #wcf #mvp

Вопрос:

Я новичок в WCF, и я также изучаю шаблон проектирования MVP. У меня есть тестовый проект с работающей службой WCF. Я могу протестировать с помощью тестового клиента WCF, и он работает нормально.

Мне нужна помощь в том, как вызвать службу WCF с моего уровня презентатора, а затем попросить презентатора передать данные обратно в представление (winforms). У меня есть форма Windows с двумя текстовыми полями с именами txtProductID и txtDescription. У меня также есть кнопка с именем btnGetProductData. Я хотел бы, чтобы произошло следующее:

  1. Я введу идентификатор продукта в поле txtProductID.
  2. Я нажму кнопку 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:

Я не уверен, в чем у вас возникли проблемы, поэтому я начну с самого начала.

  1. Вам необходимо добавить «Ссылку на службу» в ваш проект уровня презентации (это генерирует прокси-класс, который вы можете использовать для вызова своей службы).
  2. Вам необходимо создать экземпляр сгенерированного прокси-класса
  3. Вам нужно вызвать метод в классе прокси и сохранить его значение

В 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. Первые два комментария выше не в порядке из-за моих неуклюжих попыток объединения и редактирования. Похоже, что нет способа заставить их отображаться в правильном порядке.