WCF DataContract and DataMember

8843 ワード


この記事では、WCFの重要な2つのメンバー、WCF DataContract and DataMemberについてお話しします.クライアントでサービスを呼び出すには、オブジェクトまたはオブジェクトの属性を契約オブジェクトまたは契約メンバーとしてマークする必要があります.そうすると、WCFは私たちの転送先をXMLのフォーマットに変換して転送します.次に、クライアントにユーザIDを入力することで、サービス側からユーザの情報を照会する例を示す.サービス側でWEB側から転送されたユーザIDに従ってライブラリにクエリを行う.
  1.データベースの作成
   
<span style="font-family:SimSun;font-size:18px;">create table tblEmployee
(
	id int,
	name nvarchar(50),
	Gender nvarchar(50),
	DateOfBirth datetime
)

insert into tblEmployee values(1,'MARK','male','10/10/1980')
insert into tblEmployee values(2,'Mary','male','10/10/1980')
insert into tblEmployee values(3,'Job','female','10/10/1980')


create procedure spGetEmployee
	@id int 
	 as
 Begin
		select id,name,gender,dateofbirth from tblEmployee where
		id=@id
End

select * from tblEmployee

create procedure spSaveEmploye
	@id int,
	@name nvarchar(50),
	@Gender nvarchar(50),
	@dateofbirth datetime
	as
	begin
		insert into tblEmployee
		values(@id,@name,@gender,@dateofbirth)

	end
</span>

上記は簡単な表を作成し、2つの村の太いプロセスを作成しました.
  2.WCFサービスの確立
従来と同様にWCFサービスも必要であり,まず契約対象を確立する.
      
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace EmployeeService
{
    [DataContract(Namespace="http://EmployeeService/Employee")]
    public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Name="id",Order=1)]
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }



        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public DateTime DateOfBirth
        {
            set { _dateOfBirth = value; }
            get { return _dateOfBirth; }
        }

    }
}
</span>

従業員クラスの確立が完了すると、WCFの2つのサービスの確立が開始されます.ここでは、保存とクエリーの方法を提供します.
  
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data;
namespace EmployeeService
{
    //   :   “  ”    “   ”  ,                 “EmployeeService”。
    public class EmployeeService : IEmployeeService
    {
     
        public Employee GetEmployee(int Id)
        {
            Employee employee = new Employee();
            string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("spGetEmployee", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter parameterId = new SqlParameter();
                parameterId.ParameterName = "@id";
                parameterId.Value = Id;
                cmd.Parameters.Add(parameterId);
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read()) {
                    employee.ID = Convert.ToInt32(reader["id"]);
                    employee.Name = reader["Name"].ToString();
                    employee.Gender = reader["Gender"].ToString();
                    employee.DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]);

                }

                return employee;
            }
        }

        public void SaveEmployee(Employee Employee)
        {
         
            string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("spSaveEmploye", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter parameterId = new SqlParameter();
                parameterId.ParameterName = "@id";
                parameterId.Value = Employee.ID;
                cmd.Parameters.Add(parameterId);
                SqlParameter parameterName = new SqlParameter();
                parameterId.ParameterName = "@name";
                parameterId.Value = Employee.Name;
                cmd.Parameters.Add(parameterName);


                SqlParameter parameterGender = new SqlParameter();
                parameterId.ParameterName = "@gender";
                parameterId.Value = Employee.Gender;
                cmd.Parameters.Add(parameterGender);

                SqlParameter parameterDateOfBirth = new SqlParameter();
                parameterId.ParameterName = "@dateofbirth";
                parameterId.Value = Employee.DateOfBirth;
                cmd.Parameters.Add(parameterDateOfBirth);
                con.Open();
                cmd.ExecuteNonQuery();

              
            }
        }
    }
}
</span>

  3.ホストの作成
従来と同様にWCF宿主を設立し、WCFに運行場所を提供する必要がある
  
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace EmployeeServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(EmployeeService.EmployeeService)))
            {
                host.Open();
                Console.WriteLine("host started" + DateTime.Now.ToString());
                Console.ReadLine();
            }
        }
    }
}
</span>

  4.クライアントの作成
上記のプロセスが確立されると、クライアントを確立することができ、紙面に鑑みて、このマルチシールコードはなくなります.最後にDEMOを添付します
  5.小結
     1.はい.net3.5では、エンティティオブジェクトにdatacontractのラベルを付ける必要はありません.Data ContractSerializerは、Publicプロパティを自動的にシーケンス化します.
      2.オブジェクトSerializableをマークすると、プライベート属性を含むすべての属性がシーケンス化されます.以下に示す
     
<span style="font-family:SimSun;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>

-<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/EmployeeService" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.datacontract.org/2004/07/EmployeeService" elementFormDefault="qualified">


-<xs:complexType name="Employee">


-<xs:sequence>

<xs:element name="_dateOfBirth" type="xs:dateTime"/>

<xs:element name="_gender" type="xs:string" nillable="true"/>

<xs:element name="_id" type="xs:int"/>

<xs:element name="_name" type="xs:string" nillable="true"/>

</xs:sequence>

</xs:complexType>

<xs:element name="Employee" type="tns:Employee" nillable="true"/>

</xs:schema></span>

  3.DatacontactまたはDataMemberと表記すると、我々の表記に従ってシーケンス化されるのが最も一般的です.
  4.DataContractのメリットは、シーケンス化された外部の名前、順序、ネーミングスペースを変更できることです.
  
<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace EmployeeService
{
   [DataContract(Namespace="http://Employee/employee")]
    public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Name="id",Order=1)]
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }


        [DataMember(Name = "Name", Order = 2)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public DateTime DateOfBirth
        {
            set { _dateOfBirth = value; }
            get { return _dateOfBirth; }
        }

    }
}
</span>

本編ブログDemo:WCFでのDataContractとDatamenber