0

C# でイベント アーキテクチャを実装する際に少し問題があります。基本的なレイアウトは次のとおりです。

サーバーと通信するネットワーク層(dll)があります。このレイヤーは、データベース内の変更イベント用にいくつかのインターフェイスを作成しました。データベース フィールドが変更され、dll が適切なインターフェイスの実装を呼び出します。GUI があり、そのメイン メソッド内にデータ オブジェクトがあります。このデータ オブジェクトには、ユーザーが何かを変更するまで表示する一時データのリストが格納されます。変更があった場合は、変更をデータベースに送信します。

問題は、ネットワーク層内にイベントハンドラーを実装できないこと、またはそのインターフェイスの実装ができないことです。これは、データオブジェクト (イベントの結果を取得する必要があります) が GUI 内にのみ存在するためです。 main メソッドであり、適切なオブジェクトには認識されていません。

疑似コードとして例を作成します。

名前空間 ClientConnection
{
    public class DataListener : IDataListener
    {
        パブリック デリゲート void SomethingReceivedHandler(オブジェクト送信者、SomethingData パケット);
        公開イベントSomethingReceivedHandler somethingRecievedHandler;

        public void SomethingReceived(SomethingData パケット)
        {
            if (SomethingRecievedHandler != null)
            {
                何か受信ハンドラー (この、パケット);
            }
        }

インターフェイスの現在の実装です。レイヤーには次のようなものがあります。

private void ProcessPacket(SomethingData パケット)
        {
            もし (パケット == ヌル)
                戻る;
            試す
            {
                if (パケットはSomethingData)
                    DataListener.SomethingReceived(SomethingData としてのパケット);
//をちょきちょきと切る

そして、私の主な方法は次のとおりです。

パブリック部分クラス Main : FormMain
    {
        データ ClientData; //GUI 内のすべての一時データが含まれます

        public frmMain()
        {
            ClientData = 新しいデータ();
            DataListener dataListener = newDataListener();
            InitializeComponent();
        }

ClientData.SomeList.Add(packet) そして、イベントが発生した場合は、コンテキストに応じて次のようなことをしたいと考えてい ます。

4

1 に答える 1

1

問題は、ネットワーク層内にイベントハンドラーを実装できないこと、またはそのインターフェイスの実装ができないことです。これは、データオブジェクト (イベントの結果を取得する必要があります) が GUI 内にのみ存在するためです。 main メソッドであり、適切なオブジェクトには認識されていません。

問題があるかどうかわかりません。イベントのパブリッシャーは、イベントのサブスクライバーについて何も知る必要はありません。それがイベントの有用性です。

疑似コードに基づいて、次のように単純にする必要があります。

public partial class Main : FormMain
{
    Data ClientData; //Contains all temporary data within the GUI

    public frmMain()
    {
         ClientData = new Data();
         DataListener dataListener = new DataListener();
         // Add an event handler
         dataListener.somethingReceivedHandler += 
             (object sender, SomethingData packet)              
             {
                if (someContext) ClientData.SomeList.Add(packet); 
             };
         InitializeComponent();
    }

おそらくdataListener、(ローカルではなく) フィールドに昇格して、フィールドが ctor の外で生き続けるようにしたいでしょう (そして、フォームが閉じたときに購読を解除できます)。

于 2012-05-26T13:02:00.317 に答える