C#版MVC架構PureMVC的深入分析和改良方案

來源:互聯網
上載者:User

  在PureMVC中,通知(Notification)貫穿整個架構,把觀察者模式發揮得淋漓盡致。MVC的三層通訊都是通過Notification來通訊。Notification由兩部分組成:Name和Body。如果把Notification當作是郵件,那麼Name就是收件者,不過在PureMVC中可以有多個觀察者(Observer)接收相同的郵件,Body自然就是Notification的內容了。Notification和Observer的關係是1:N,這點可以從View層的代碼中看出來。

Code
observerMap = new Dictionary<String, IList<IObserver>>();

 

Observer有兩個屬性:

Code
private String notify;
private Object context;

notify是方法名,context是方法的載體。當Observer接收到Notification時,將調用下面的方法

Code
public void notifyObserver(INotification notification)
{
Type t = this.getNotifyContext().GetType();
BindingFlags f = BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase;
MethodInfo mi = t.GetMethod(this.getNotifyMethod(), f);
mi.Invoke(this.getNotifyContext(), new Object[] { notification });
}

來執行notify這個方法。

  PureMVC中,註冊Observer和通知Observer都是在View層進行的。

Code
public interface IView
{
void registerObserver (String notificationName, IObserver observer);

void removeObserver(String notificationName, Object notifyContext);

void notifyObservers(INotification note);

我覺得這點設計得不太好,使得View層和Observer產生了耦合,這些事情本不應該由View層來做的。而且,Observer接收的Notification不僅僅來自於View,還會來自於Controller和Model,那麼,根據AOP的原則,應該把這部分的操作應該從MVC層的縱向分離出來,改為橫向模式。可以建立一個觀察者公司Obsertor(暫且這樣叫它吧)來統一管理觀察者,這樣就可以減輕View層的工作了。結構圖如下:

 

在PureMVC中有一個類叫Notifyer,根據字面的意思,它應該是Notification的傳遞都,也就是郵差才對。然而這個類卻不做自己的本職工作---給Observer發送通知,而是把所有通知都推給了Facade,再由Facade通過View來把Notification發送給Observer。發個通知也一波三折,我覺得這樣設計不夠合理。前面我已經建立了觀察都的公司Obsertor了,那麼Notifyer只要直接把Notification發送到Obsertor就可以了,Obsertor會把Notification發給具體的Observer。現實中的公司都是這樣子的吧,經常都是前台告訴我,我的包裹到了。因此,應該讓Notifyer做回它的本職工作。

PureMVC的C#版本在Mediator的註冊上存在著點BUG,註冊Mediator的部分代碼:

Code
public void registerMediator(IMediator mediator)
{
if (mediatorMap.ContainsKey(mediator.getMediatorName())) return;

 

它的本意是避免Mediator的重複註冊,然後當頁面重新載入時,mediatorMap裡的Mediator的視圖已經過時了,這樣就導致了無法更新頁面。我的解決方案是

Code
public void registerMediator(IMediator mediator)
{

if (mediatorMap.ContainsKey(mediator.getMediatorName()))
{
mediatorMap[mediator.getMediatorName()].setViewComponent(mediator.getViewComponent());
return;
}

局部更新一下ViewComponent,這樣就運行正常了。

  本來是想分析一下PureMVC的實現機制的,但發現自己的表達能力實在有限,心有餘而力足,但哪天有思路了,再為大家獻上。同時,我再根據自己的方案改良一下PureMVC,讓它更適用於C#,到時再將源碼一起發布。由於工作比較忙,可能要讓大家等上一陣子。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.