none
程式架構討論 RRS feed

  • 一般討論

  • 大家好~

    如果我有個通訊用的元件,然後我為了讓非同步回傳的資料可以往外傳,所以我在這個元件的建構子裡要求傳一個物件(interface)進來,然後非同步收回來的時候去呼叫這個介面,由外面去實作這個物件。

    public class A : ITransfer{
    	private INotifier _notifier;
    	public A(INotifier notifier){
    		_notifier = notifier;
    	}
    	private void receiveMsg(){
    		_notifier.ReceiveMsg(msg);
    	}
    	
    	public void SendOrder(string name){
    	    //傳送訂單
    	}
    }

    大概長這樣:然後外面的類別去處理通訊前及接收通訊後要處理的事情,因為一定要使用某個通訊元件,所以建構子一定要要傳一個ITransfer進來,但是我又希望處理通訊的全部在同一個類別裡:

    public class Order: INotifier {
    	private ITransfer _transfer;
    	public Order(ITransfer transfer){
    		_transfer = transfer;
    	}	
    	
    	public void SendOrder(){
    		_transfer.SendOrder("A");
    	}
    	
    	//收到訊息
    	public void ReceiveMsg(string msg){
    	}
    }

    怎麼看都覺得很怪沒辦法呼叫,不知道要怎麼調整才對??

    謝謝回覆~。


    2014年10月14日 上午 07:21

所有回覆

  •  星寂, 你的這個情境裡有幾種職責 ? 我想從這邊討論起可能會更明確.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年10月14日 上午 07:53
    版主
  • 呃,我不知道要怎麼分耶。

    1.負責傳遞訂單資料到各個不同平台的元件(每個平台有自己的訂單格式、不同的傳輸方式) : Transfer

    2.處理平台回應的訊息 : Notifier

    3.處理訂單狀態,然後把訂單丟到Transfer傳遞到各平台上的元件: OrderManager

    應該是這樣?


    2014年10月14日 上午 08:09
  • 為什麼我看起來覺得有循環參考的味道...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月14日 上午 08:37
    版主
  • 或許應該是將 Transfer 和 Notify 做 Bridge.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年10月14日 上午 08:51
    版主
  • 為什麼我看起來覺得有循環參考的味道...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    我也這麼覺得,所以才上來問啊XDDD

    2014年10月14日 上午 08:54
  • 可能要用 橋接模式, 用一個 Context 把 Notify 和 Transfer 橋接.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年10月14日 上午 09:24
    版主
  • 我剛才原本想說把Notify做成Observer pattern,可是因為我需要通知的事件很多,所以這樣感覺上很難改@@

    Transfer和Notify 就好像是Socket一個發一個收。只不過因為收完之後的處理我要交給外部的元件處理,所以才需要一個介面再把東西往外拋。

    2014年10月14日 上午 09:25
  • 可能要用 橋接模式, 用一個 Context 把 Notify 和 Transfer 橋接.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    可以稍微詳細說明一下嗎,看不懂~~@@

    謝謝!

    2014年10月14日 上午 09:31
  • 就是將 INotify 和 ITransfer 循環參考的部分拆開

    然後建一個 super class

    類似像這樣

    public class Bridge

    {

        public INotify Notify{get;set;}

        public ITransfer Transfer {get;set;}

        ...然後加上必要的 method 讓 Notify 和 Transfer 可以互動

    }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年10月14日 上午 10:28
    版主
  • INotify 和 ITransfer其實沒有循環參考

    是因為Manager要用ITransfer然後想要自身做為INofity才會有循環參考的問題。

    如果做為prop,這樣就沒辦法強制要求他一定要傳INotify進來了~

    同事另外提了一個指定Manager是一個泛型,然後根據定義在內部才建立ITransfer (以同樣要求一定要有ITransfer來說這樣也是可以的)

    不過以泛型的觀點來說我覺得很怪~囧。

    2014年10月16日 上午 02:22