透過 DomainService 提供資料庫 Access 給 Silverlight

  • 4009
  • 0

摘要:透過 DomainService 提供資料庫 Access 給 Silverlight

相信很多同業高手都寫過這類的文章,
不過在這邊我要介紹的方法是不用修改原本的商業邏輯的方法,
相信並不是大部份的公司或 PG 都可以將原本的整套 Framework 或是類別庫完整改用 LINQ to SQL 或是 Entity Framework 技術,因此下面這個方式算是省時省力:
1.打開 VS,建立一個新的 Silverlight 應用程式,並啟用 .NET RIA 服務

2.將現有的類別庫專案加入到方案裡

3.在 SilverlightApplication.Web 專案中加入三個參考,System.ComponentModel.DataAnotations(3.6版本)、System.configuration、System.Web.Ria

4.假設之前的類別庫專案有以下兩個類別(以我之前做的兩個類別為例):

using System;

namespace Nodes
{
    public class Node
    {
        public Guid ID { get; set; }
        public string Name { get; set; }
        public int Lft { get; set; }
        public int Rgt { get; set; }
        public string ContentID { get; set; }
    }
}

 

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace Nodes
{
    public class NodeAccess
    {
        public IEnumerable getNodes()
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString))
            {
                List<Node> nodes = new List<Node>();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "getNodeData";
                SqlDataAdapter dap = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                dap.Fill(dt);

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Node node = new Node();
                    node.ID = new Guid(dt.Rows[i]["id"].ToString());
                    node.Name = dt.Rows[i]["name"].ToString();
                    node.Lft = Convert.ToInt32(dt.Rows[i]["lft"]);
                    node.Rgt = Convert.ToInt32(dt.Rows[i]["rgt"]);
                    node.ContentID = dt.Rows[i]["parentID"].ToString();
                    nodes.Add(node);
                }

                return nodes;
            }
        }
    }
}


5.在 SilverlightApplication1.Web 專案中加入 .NET 的參考,System.Web.DomainService,以及類別庫專案的 Nodes 參考

6.在 SilverlightApplication1.Web 專案中加入一個新項目(DomainServiceClass)如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.DomainServices;
using System.Web.Ria;

namespace SilverlightApplication1.Web
{
    [EnableClientAccess()] //給 Silverlight 端存取所需 Attribute
    public class SilverlightService : DomainService
    {
        public IEnumerable GetNodes()
        {
            List<Node> nodes = new List<Node>();
            List<Nodes.Node> nodes2 = (List<Nodes.Node>)new Nodes.NodeAccess().GetNodes();
            foreach (Nodes.Node temp in nodes2)
            {
                Node node = new Node();
                node.ID = temp.ID;
                node.Name = temp.Name;
                node.Lft = temp.Lft;
                node.Rgt = temp.Rgt;
                node.ContentID = temp.ContentID;
                nodes.Add(node);
            }
            return nodes;
        }
    }

    [EnableClientAccess()] //給 Silverlight 端存取所需 Attribute
    public class Node
    {
        [Key] //PK
        public Guid ID { get; set; }
        public string Name { get; set; }
        public int Lft { get; set; }
        public int Rgt { get; set; }
        public string ContentID { get; set; }
    }
}


7.建置一下方案中的每一個專案,順序是類別庫、Web 專案、Silverlight 專案~~~

8.在 SilverlightApplication 專案中將 MainPage.xaml 及其 .cs 檔案修改如下:







using System.Windows.Controls;
using SilverlightApplication1.Web;

namespace admin
{
    public partial class MainPage : UserControl
    {
        SilverlightContext context = new SilverlightContext();

        public MainPage()
        {
            InitializeComponent();
            this.gvNodes.ItemsSource = context.Nodes;
        }

        private void btnSearch_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            this.context.Load(this.context.GetNodesQuery());
        }
    }
}


9.按一下 Debug 看看有沒有東西出來啦~~~ QQ

10.範例程式下載