2010-07-26 23 views
3

我想在ASP.NET MVC 2中實現一個自定義用戶對象。我已經看到了一個解決方案,您可以在Global.asax中做一些魔術,將Controller.User轉換爲另一種類型,CustomUser。但Controller.User仍然是一個IPrincipal,這意味着我每次想使用它時都必須將其轉換爲CustomUser,而我完全不喜歡它。在ASP.NET MVC 2中的自定義用戶

使用GetUser()方法讓GetUser()調用用戶存儲庫並使用Controller.User獲取我們自己的自定義用戶對象時,會認爲是錯誤的或不正確的做法?

我想要做的只是添加一些屬性到用戶對象。

回答

1

會是算錯了,還是壞 的做法,有AA基本控制器 用的getUser()方法,其中 的getUser()調用用戶信息庫,並 使用Controller.User獲取我們自己 自定義用戶對象?

我不這麼認爲。這是我做這件事的方式。 ;)

+0

那麼你如何避免混淆是否使用this.User或this.GetUser()? :) – 2010-07-27 05:47:04

+0

@Anders Ekdahl,由返回類型。 – jfar 2010-07-27 12:23:24

0

那就是做到這一點,但你會希望儘量減少你需要轉換用戶對象,以儘量減少里氏替換原則的違反量:http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29

而不是每次鑄造它,在ActionFilter中沒有什麼東西可以掩埋嗎?

+0

你說「這是做到這一點的方式」,但你是指哪種方式? :)聽起來像你的意思是將自定義用戶注入Controller.User。我同意這聽起來像是最好的解決方案,但我無法弄清楚如何避免那些討厭的演員。 – 2010-07-27 05:52:39

+0

哎呀,我應該已經更清楚了,我的意思是使用基類和GetUser方法,正如你所提到的。我的觀點是儘量減少鑄造的需要,例如如果您始終投射以獲取用戶的角色,那麼您是否可以在動作過濾器中執行此操作,並隱藏您使用自定義對象的速度。如果你確實需要自定義用戶對象,那麼考慮創建一個IUserService,它返回自定義用戶,並通過IoC容器注入(可以在BaseController上聲明)。這樣的代碼是可測試的,你沒有強制轉換 – amarsuperstar 2010-07-27 08:41:17

+0

嗯,我沒有在基本控制器中帶有GetUser()的任何強制轉換。只有在Controller.User中需要自定義對象時才需要強制轉換,因爲這是鍵入IPrincipal。 現在,我有一個基本控制器,它有一個IdentityLoader,在IoC構造控制器後設置。基本控制器有一個GetIdentity()方法,如果尚未調用IdentityLoader.Load(),則該方法將被調用。 – 2010-07-27 10:56:55

1

這裏是我會做:

在的global.asax.cs

protected void Application_PostAuthorizeRequest() 
{ 
    if (HttpContext.Current.User != null && HttpContext.Current.User.Identity != null && !string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name)) 
    { 
     HttpContext.Current.Items["User"] = userRepo.FetchByUsername(HttpContext.Current.User.Identity.Name); 
    } 
} 

public static CustomUser CurrentUser 
{ 
    get 
    { 
     return HttpContext.Current.Items["User"] as CustomUser; 
    } 
} 

那麼你有一個方便的靜態在它與當前用戶。這是一種骯髒但有效的方式。

當然,我真的會將用戶添加到我的IOC容器中,並通過啓用IOC的ControllerFactory將其注入到控制器中。這是「正確」的事情。

無論你做什麼,都不要使用基類!從長遠來看,使用靜態可能更容易維護,而不是創建一個龐大的基類,所有需要掌握的「便利」的東西。

+0

對我來說,靜態調用比基類差。我同意你的觀點,我不喜歡巨大的基類,但是我們所有的控制器都需要與當前用戶進行交互。基類只會獲得從IoC注入的UserLoader,而GetUser()方法只會將該調用代理給加載器。 – 2010-07-27 05:50:59

+0

有一天,你會最終需要另一項服務,但不是所有的控制器。然後有些搖擺會將它添加到基類中,而且!怪物基類誕生了! 如果您想「正確」使用ControllerFactory。 http://code.google.com/p/autofac/wiki/MvcIntegration – mcintyre321 2010-07-27 12:04:22

+0

我已經在使用控制器工廠,並使用StructureMap來注入依賴關係。我不喜歡注入用戶對象,但我可以很好地注入UserLoader。但是,那麼我所有的控制器都將依賴於UserLoader類,User類以及UserLoader.Load()帶有Controller對象的事實。相反,我的控制器只依賴於this.GetUser()返回一個用戶。 – 2010-07-29 16:04:51

相關問題