2015-01-21 73 views
0

我最近在應用程序中偶然發現了以下內容,我很想知道這是好還是不好的做法。我看到的是在應用程序,業務邏輯和最終我們的框架中的不同級別上訂閱的事件。活動訂閱最佳實踐

我們的功能驗證和授權的用戶,這是一個HttpModule基本上做如下策劃(我只包含最相關的部分):

public class FooModule : IHttpModule 
    { 
     private IIdentityProvider _identityProvider; 

     public void Init(HttpApplication context) 
     { 
      _identityProvider = TypeFactory.Create<IIdentityProvider>("...type string from configuration..."); 
      identityProvider.Init(context, ...); 

      context.PostAuthenticateRequest += OnAuthenticateRequest; 
      context.PostAuthenticateRequest += OnAuthenticateRequestLogging; 
     } 

     ... 
    } 

到目前爲止,一切都好:HTTP模塊識別配置的身份提供者將其初始化並訂閱一些事件。事件處理程序在這裏沒有問題,所以我省略了它們。

然後,在任意的身份提供者的初始化:

public class BarIdentityProvider : IIdentityProvider 
{ 
    public void Init(HttpApplication httpApplication, ...) 
    { 
     var authorizer = new BarAuthorizationProvider(); 
     authorizer.Init(httpApplication, ...); 

     httpApplication.PostAuthenticateRequest += httpApplication_PostAuthenticateRequest; 
     httpApplication.AuthorizeRequest += httpApplication_AuthorizeRequest; 
    } 

    ... 
} 

而且在AuthorizationRequestHandler會發生以下情況:

public class BarAuthorizationProvider 
{ 
    public void Init(HttpApplication httpApplication, ...) 
    { 
     httpApplication.PostAuthorizeRequest += OnAuthorizeRequest; 
    } 

    ... 
} 

正如你所看到的,有被訂閱了FooModule事件,BarIdentityProvider和BarAuthorizationProvider,對我來說,它是作爲意大利麪條發生的。此外,這樣做的時候:

var authorizer = new BarAuthorizationProvider(); 
authorizer.Init(httpApplication, ...); 

我不指望authorizer訂閱各種活動和工作「神奇」。

作爲一個軟件開發我期待之一:

  1. 一個的HttpModule訂用必要的事件,並要求對身份和訪問信息的身份提供商和授權商。提供者中的事件處理被最小化。
  2. 多個HttpModules(即認證和授權模塊),每個HttpModules訂閱必要的事件。提供者中的事件處理被最小化。

我正確嗎?還是有反對我的期望的論據?

回答

0

我的第一個問題是,「提供程序中的事件處理最小化」是否很重要?即什麼具體的優勢是有達到那個目標?

我也想知道「意大利麪條」是什麼意思。我的意思是,它清楚地引用了「意大利麪代碼」這個古老的概念,但是這個概念是指執行路徑複雜化的代碼,最常見的原因是使用非結構化流量控制(即goto語句)。在討論事件處理時,我看不出有什麼類似意大利麪。

換句話說,「意大利麪條」這個短語在這裏看起來有些偏見。即「意大利麪條」這個詞剛剛被引入,因爲它已被理解爲貶義詞。但對執行缺乏明確的反對意見,貶義似乎是不合理的,「意大利麪條」一詞似乎並沒有像「意大利麪代碼」那樣提供真正有用的隱喻。


所以,回到「最小化提供者中的事件處理」。爲什麼這應該很重要?你寫到「事件處理程序在這裏沒有問題」,但是這似乎表明提供程序中的處理程序是合適的。即他們的工作與供應商相關(可能只對供應商提供)。那麼他們還有什麼要做的呢?

在我看來(我寫這個事實表明你的問題可能被認爲是無關緊要的,主要是基於意見的,但我認爲有一個客觀的方法來看待這個問題,即使這只是我的意見:)),基於事件的編程模型的一個重要優點是減少了耦合。假設必須完成的某處,那麼訂閱這些事件的這些提供者對象的替代方法是讓其他對象瞭解提供者對象的需求,並且代表提供者對象滿足這種需求。

但是,您剛剛裝載了具有提供者對象特定知識的其他對象。這增加了類型之間的耦合。其中一般是不好的的事。


如果在另一方面,你覺得在供應商的事件處理程序可以移動到一些其他類型的不更強烈耦合類型,那麼那麼就表明該事件處理程序確實是在供應商不恰當的。但在這種情況下,這些事件處理程序的細節在這裏肯定是相關的,這與您的斷言相反。

I.e. 其中事件處理程序的執行取決於它的功能。但是由於你似乎並不關心這些處理者的具體內容,這表明他們在他們所屬的地方是正確的,因此訂閱事件根本不是問題。