WCF Перемещение DataContracts - PullRequest
       6

WCF Перемещение DataContracts

0 голосов
/ 15 сентября 2009

Это полнофункциональная программа WCF Hello World. То есть Я могу запустить эту программу без каких-либо исключений.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace DataContractsNamespace
{
    [DataContract]
    public class AccountInfo
    {
        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Clients
{
    public class BankProxy : ServiceContractsNamespace.IBank
    {
        ServiceContractsNamespace.IBank channel;

        public BankProxy()
        {
            channel = ChannelFactory<ServiceContractsNamespace.IBank>.CreateChannel(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/Services/BankService"));
        }

        public decimal GetAcccountBalance(string AcctNo)
        {
           return channel.GetAcccountBalance(AcctNo);
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
             return channel.GetAccountInfo(AcctNo);
        }
    }
}

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;

namespace ServiceContractsNamespace
{
    [ServiceContract]
    public interface IBank
    {
        [OperationContract]
        decimal GetAcccountBalance(string AcctNo);

        [OperationContract]
        DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Clients
{
    class Program
    {
        static void Main(string[] args)
        {
            BankProxy prox = new BankProxy();
            Console.WriteLine("Hit enter to invoke the service call. Type exit then enter to close");

            while (Console.ReadLine() != "exit")
            {
                string balance = prox.GetAcccountBalance("1234").ToString("c");
                DataContractsNamespace.AccountInfo ai = prox.GetAccountInfo("1234");
                Console.WriteLine("{0} {1} your account balance is {2}.", ai.FirstName, ai.LastName, balance);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hosts
{
    public class BankService : ServiceContractsNamespace.IBank
    {
        public decimal GetAcccountBalance(string AcctNo)
        {
            return 1.37m;
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
            DataContractsNamespace.AccountInfo ai = new DataContractsNamespace.AccountInfo();
            ai.FirstName = "Paul";
            ai.LastName = "Johansen";
            return ai;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Hosts
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost servHo = new ServiceHost(typeof(BankService), new Uri("http://localhost:8000/Services"));
            servHo.AddServiceEndpoint(typeof(ServiceContractsNamespace.IBank), new BasicHttpBinding(), "BankService");

            servHo.Open();
            Console.WriteLine("This service is open for business. Hit Enter to close.");
            Console.ReadLine();
            servHo.Close();
        }
    }
}

Как видите, AccountInfo - контракт данных совместно используется клиентом и хостом.

Мне нужно хранить данные только для хоста / сервисной стороны.

Клиенты должны видеть только интерфейсы DataContracts (например, IAccountInfo).

Как мне изменить мою программу, чтобы ввести IAccountInfo?

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

Похоже, вы хотите вернуть интерфейс вместо класса. Я не совсем уверен, почему вы не можете вернуть AccountInfo. Однако вы должны быть в состоянии сделать это, но вам нужно будет использовать KnownType или, возможно, ServiceKnownType, чтобы заставить его работать.

В качестве альтернативы, если вы работаете в полностью .NET-среде, вы можете использовать NetDataContractSerializer вместо DataContractSerializer.

Для справки и примеров вы можете проверить:

1 голос
/ 15 сентября 2009

А что IBank.GetAccountInfo должен вернуть клиенту, если вы не хотите делиться AccountInfo? создать 2 класса, сделать первый datacontract второй нет, и где вы хотите поделиться использовать первый, где нет, второй

...