using System.Runtime.Serialization;
using System.ServiceModel;
namespace WcfService1
{
/// <summary>
/// Interface para el contrato de servicio.
/// Define las operaciones que se pueden realizar con este servicio
/// </summary>
[ServiceContract]
public interface IService1
{
/// <summary>
/// Suma numeros complejos
/// </summary>
/// <param name="n1">Nro Complejo</param>
/// <param name="n2">Nro Complejo</param>
/// <returns>Resultado de sumar n1 y n2</returns>
[OperationContract]
ComplexNumber Add(ComplexNumber n1, ComplexNumber n2);
/// <summary>
/// Resta numeros complejos
/// </summary>
/// <param name="n1">Nro Complejo</param>
/// <param name="n2">Nro Complejo</param>
/// <returns>Resultado de restar n2 a n1</returns>
[OperationContract]
ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2);
/// <summary>
/// Multiplica numeros complejos
/// </summary>
/// <param name="n1">Nro Complejo</param>
/// <param name="n2">Nro Complejo</param>
/// <returns>Resultado de multiplicar n1 por n2</returns>
[OperationContract]
ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2);
/// <summary>
/// Divide numeros complejos
/// </summary>
/// <param name="n1">Nro Complejo</param>
/// <param name="n2">Nro Complejo</param>
/// <returns>Resultado de dividir n1 en n2</returns>
[OperationContract]
ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2);
/// <summary>
/// Crear un numero complejo
/// </summary>
/// <remarks>
/// El problema de esta operacion es que instancia el objeto del lado del servidior
/// y lo transfiere, es LENTO !!!!!!!!!!!!!!1
/// pero no hay otra alternativa para objetos que requieren lógica de construccion
/// En este caso es solo un ejemplo, y de hecho esa caracteristica debe evitarse en
/// las aplicaciones que consumen servicios web, simplemente tienen que les envía el
/// el servidor y en caso de mandar algo debe ser plano.
/// </remarks>
/// <param name="real">Parte real</param>
/// <param name="imaginary">Parte imaginaria</param>
/// <returns>Numero complejo</returns>
[OperationContract]
ComplexNumber NewComplexNumber(double real, double imaginary);
}
/// <summary>
/// Clase para definir que es un numero complejo
/// Define los datos que se transfieren
/// </summary>
[DataContract]
public class ComplexNumber
{
[DataMember]
public double Real;
[DataMember]
public double Imaginary;
/// <summary>
/// Constructor especializado
/// <remarks>
/// Este constructor solo se visulaiza del lado del servidor, en el lado del cliente
/// se pude usar el constructor por defecto y acceder a cada propiedad
/// </remarks>
/// </summary>
/// <param name="real">parte real</param>
/// <param name="imaginary">parte imaginaria (la que se multiplica por i)</param>
public ComplexNumber(double real, double imaginary)
{
this.Real = real;
this.Imaginary = imaginary;
}
}
}