欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Composite UI Application Block學(xué)習筆記之Event Broker
Composite UI Application Block著(zhù)重于將應用邏輯和界面分開(kāi),讓?xiě)孟到y具備更清晰的結構,更強的擴展性、可移植性。在曹?chē)烂飨壬闹v座中,提及到了關(guān)于應用CAB開(kāi)發(fā)的幾個(gè)指導性原則:
  • 將 views (SmartPart)設計為獨立于 controllers 的單元
  • 共享模塊狀態(tài)
  • 共享基礎服務(wù)
  • 封裝用例 - 重用
  • 降低模塊間的依賴(lài)性
  • 盡量使用 events, services, and interfaces

     我在學(xué)習的過(guò)程中也理解到以上原則的重要性和指導性,在我學(xué)習模塊狀態(tài)和Event Broker的過(guò)程中,也將上述部分原則做了特意的應用。那么我們還是通過(guò)一個(gè)實(shí)例來(lái)學(xué)習Event Broker和這些原則。

一、文中有關(guān)術(shù)語(yǔ)

    下面這些術(shù)語(yǔ)是CAB中常用到的,以下的解釋僅是我個(gè)人的理解,不敢保證完全準確,園子里的朋友請指教。

    Event Broker:事件代理,通過(guò)事件源和訂閱事件源來(lái)達成對象之間的協(xié)作。

    Event Publisher: 事件發(fā)布者,在CAB里是一個(gè)用屬性EventPublication修飾的事件對象,提供特定的URL給Event Subscriber訂閱。

    Event Subscriber: 事件訂閱者,在CAB里是一個(gè)用屬性EventSubscription修飾的方法,根據修飾提供的URL自動(dòng)尋找事件發(fā)布者。Publisher和Subscriber之間由主題(由URL決定),消息(特定的 EventArgs),事件域(來(lái)確定是全局事件還是局部事件)來(lái)達成一致。其實(shí)這也是觀(guān)察者模式的具體實(shí)現。

    WorkItem:代表一個(gè)用例,也可以看成是某個(gè)業(yè)務(wù)完成的過(guò)程,它包含在WorkSpace中,服務(wù)于Service Agents(服務(wù)代理),并且加載其狀態(tài)。創(chuàng )建其他組件或者視圖,CAB來(lái)創(chuàng )建controller.組件共享WorkItem的狀態(tài),并且可以通過(guò)狀態(tài)來(lái)控制用例的生命周期。

    WorkItem State:狀態(tài),實(shí)際上是把業(yè)務(wù)對象或者業(yè)務(wù)對象的屬性,通過(guò)WorkItem State共享出來(lái),方便其他業(yè)務(wù)對象或者視圖訪(fǎng)問(wèn)。

二、體驗Event Broker應用

    講了這么多有關(guān)Event Broker的理論和概念了,我們還是通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)體驗Event Broker這種實(shí)現模式的優(yōu)越性吧。

1.應用場(chǎng)景

     平時(shí)我們在開(kāi)發(fā)過(guò)程中碰到最多的例子大概就是,一個(gè)業(yè)務(wù)對象數據集要通過(guò)dataGrip,ListBox甚至Chart控件等將其表現出來(lái)了。今天,我在學(xué)習筆記里也以這個(gè)例子來(lái)闡述Event Broker,在開(kāi)發(fā)中帶來(lái)的好處。

    場(chǎng)景是這樣的:某人事信息管理軟件要求輸入人員的性別和姓名,并且能將輸入的人員在通過(guò)表格和列表框的形式表現出來(lái),同時(shí)錄入人員的男女比例要能適時(shí)的通過(guò)餅圖顯示。

2.分析場(chǎng)景,確定開(kāi)發(fā)模式

a.需求中涉及到的唯一業(yè)務(wù)對象是人員,具有性別和姓名兩個(gè)屬性。為了簡(jiǎn)單起見(jiàn)我們可以建立數據集來(lái)代替該對象。

b.需求要求能輸入姓名、性別,我們可以用文本框和下拉框來(lái)完成信息采集。

c.需求要求人員信息,通過(guò)表格,ListBox和餅圖來(lái)顯示,我們可以在VS2005中用DataGrid、ListBox、ReportView來(lái)實(shí)現此項需求。

d.由于業(yè)務(wù)對象單一,而信息表現卻又多個(gè),適合用觀(guān)察者模式進(jìn)行開(kāi)發(fā)。我們便采用CAB中的Event Broker作為重要的實(shí)現手段。

3.建立應用程序

第一步:新建項目

     啟動(dòng)VS2005,新建Windows Application,添加以下引用:

Microsoft.Practices.CompositeUI

Microsoft.Practices.CompositeUI.WinForms

Microsoft.Practices.ObjectBuiler

Microsoft.Practices.CompositeUI.Utility

Microsoft.Practices.CompositeUI.WinForms

第二步:建立數據集

    右擊項目文件夾,添加新項,選擇數據集,建立用戶(hù)信息數據集(沒(méi)有通過(guò)代碼創(chuàng )建,主要是為了設計報表方便)。為數據集添加DataTable1的表,為DataTable1添加列Sex和Name。

第三步:繪制界面

     在VS2005默認生成的Form1上建立餅圖、DataGrid、ListBox和相關(guān)相關(guān)控件,具體操作我在此略過(guò),最終效果如下圖:



第四步:修改入口程序

    為了讓程序能使用CAB,我們必須修改程序的入口類(lèi)Program.cs。最終修改結果如下:
   

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Data;
using Microsoft.Practices.CompositeUI;
using Microsoft.Practices.CompositeUI.WinForms;

namespace TestReport
{
  
class Program : FormShellApplication<WorkItem, Form1>
{
/// <summary>
/// The main entry point for the application.
/// </summary>

[STAThread]
static void Main()
{
  
new Program().Run();
}


protected override void BeforeShellCreated()
{
  
base.BeforeShellCreated();
//共享狀態(tài),通過(guò)"dataset"關(guān)鍵字訪(fǎng)問(wèn)
  RootWorkItem.State["dataset"= new DataSet1();
}

}

}


   需要注意的是:為了能使用WorkItem的State,在Shell創(chuàng )建之前必須給共享的狀態(tài)賦初值,否則在訪(fǎng)問(wèn)該狀態(tài)時(shí)將出現狀態(tài)沒(méi)有創(chuàng )建實(shí)例的運行時(shí)錯誤。本例中就是加入以下代碼:

protected override void BeforeShellCreated()
{
  
base.BeforeShellCreated();
  RootWorkItem.State[
"dataset"= new DataSet1();
}

第五步:建立controller

建立controller負責用戶(hù)信息添加,建立事件源。添加類(lèi)文件,命名為Form1Controller,將該類(lèi)從controller繼承。如下代碼所示:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.CompositeUI;
using Microsoft.Practices.CompositeUI.EventBroker;
using Microsoft.Practices.CompositeUI.Utility;
using System.Data;
namespace TestReport
{
 
public class Form1Controller: Controller
 
{
  }


}


在controller中公布一個(gè)事件發(fā)布者,通過(guò)"topic://TestReport/DataRowAdded"來(lái)標識Publisher,默認的事件域為全局。也可以通過(guò)PublicationScope枚舉來(lái)設置事件的作用域。事件作用域有以下三種:

PublicationScope.WorkItem :僅作用于引發(fā)當前發(fā)布的WorkItem實(shí)例

PublicationScope.Global:作用于引發(fā)當前發(fā)布的WorkItem所有實(shí)例

PublicationScope.Descendants:僅作用于引發(fā)當前發(fā)布的WorkItem實(shí)例,以及該WorkItem的任何級別的子WorkItem實(shí)例。

本例通過(guò)以下代碼發(fā)布事件:

[EventPublication("topic://TestReport/DataRowAdded")]
public event EventHandler<DictionaryEventArgs> DataRowAdded;

controller中主要來(lái)實(shí)現業(yè)務(wù)邏輯,于是我們需要添加一個(gè)方法AddNewRow(int sex, string name),用來(lái)實(shí)現人員信息的添加,代碼如下:


private DataSet1 ctldataset;
 
//controller的AddNewRow方法,引發(fā)事件DataRowAdded
public void AddNewRow(int sex, string name)
{
if (DataRowAdded != null)
{
  DataRow myRow 
= ctldataset.DataTable1.NewRow();
  myRow[
0= sex;
  myRow[
1= name;
  ctldataset.DataTable1.Rows.Add(myRow);
  ctldataset.AcceptChanges();

  DictionaryEventArgs args 
= new DictionaryEventArgs();
  args.Data[
"dataRow"= myRow;
  DataRowAdded(
this, args);

  State.RaiseStateChanged(
"dataset", myRow);
}

}


   大家請注意下面代碼,其實(shí)是定義了一個(gè)DictionaryEventArgs參數,并且將當前添加的行對象作為該參數的值。當DataTable1中行添加后,我們引發(fā)事件DataRowAdded(this, args)。  此時(shí),事件源被觸發(fā)了,訂閱者就可以接收到該事件廣播了。

DictionaryEventArgs args = new DictionaryEventArgs();
args.Data["dataRow"] = myRow;
DataRowAdded(this, args);

   到此,我們已經(jīng)完成了事件源的創(chuàng )建和發(fā)布,為了達到演示的效果,我們還需要實(shí)現共享WorkItem State來(lái)廣播事件。如以下代碼:


[State("dataset")]
public DataSet1 CtlDataSet 
{
set 
{
  ctldataset 
= value;
}

}

public new State State
{
  
get return base.State; }
}


    我們注意到[State("dataset")]這行代碼,它是用來(lái)表示W(wǎng)orkItem的屬性CtlDataSet,將通過(guò)[State("dataset")]共享出去,同時(shí)當CtlDataSet改變時(shí),通過(guò)代碼State.RaiseStateChanged("dataset", myRow),來(lái)引發(fā)狀態(tài)改變事件,其他地方就可以得到該事件的委托。

第六步:整合界面和controller
    我們回到Form1.cs編輯代碼。為了讓界面和controller和界面結合,我們將controller作為界面對象的一個(gè)屬性,用以下代碼實(shí)現:
//定義該窗體相關(guān)的Controller
private Form1Controller controller;

//將該窗體相關(guān)的Controller標記為自動(dòng)創(chuàng )建實(shí)例
[CreateNew]
public Form1Controller Controller
{
  
set { controller = value; }
}

 

   為添加按鈕加入代碼,實(shí)現添加一個(gè)人員信息:

private void btn_AddToTable_Click(object sender, EventArgs e)
{
if((this.textBox1.Text.Trim().Length >0))
{
 
this.controller.AddNewRow(this.cmbSex.SelectedIndex, this.textBox1.Text.Trim());

}

}

   還有為了讓Grid和report view能夠同步顯示人員信息,我們需要訂閱由topic://TestReport/DataRowAdded標示的事件:

[EventSubscription("topic://TestReport/DataRowAdded")]
public void OnCustomerAdded(object sender, DictionaryEventArgs e)
{
this.dataGridView1.DataSource = ((DataSet1)this.controller.State["dataset"]).DataTable1.DefaultView;
this.DataTable1BindingSource.DataSource = ((DataSet1)this.controller.State["dataset"]).DataTable1.DefaultView;
this.reportViewer1.RefreshReport();
}

 

   這樣每添加一個(gè)人員,Grid和Reoport View就能適時(shí)更新自身表現了,這就是Event Broker的實(shí)現方式,簡(jiǎn)單并且簡(jiǎn)潔。前面我們還提到了通過(guò)共享狀態(tài)來(lái)實(shí)現視圖和業(yè)務(wù)對象的關(guān)聯(lián),在本例中也提供實(shí)現。

首先,在FormLoad事件中訂閱StateChanged事件:

 

private void Form1_Load(object sender, EventArgs e)
{
this.controller.State.StateChanged += new EventHandler<StateChangedEventArgs>(State_Changed);
}

然后,通過(guò)代碼更新List狀態(tài):

void State_Changed(object sender, StateChangedEventArgs e)
{
this.listBox1.DataSource = ((DataSet1)this.controller.State["dataset"]).DataTable1.DefaultView;
this.listBox1.DisplayMember = "Name";
this.listBox1.ValueMember = "Name";
}

好了,到此我們的例程已經(jīng)大功告成,最終的運行效果如下圖:



本文相關(guān)代碼通過(guò)此連接下載:/Files/hyphappy/TestReport.rar

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Chapter 1. B. Solution Architecture: Loose Coupling with CAB
C# winform 開(kāi)發(fā)之Excel操作
C# DataSet導入導出Execl Step by Step
JQuery AJAX調用WEB SERVICE方法
C#將xml轉化為datatable的代碼
C#
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久