2017-07-28 137 views
2

我有我自己的實現GetUserId()函數使得靜態能夠在靜態上下文中檢索ID。但我也有很多地方使用內置於asp.net UserManager庫中的標準GetUserId()函數。我不使用不同的邏輯同樣的事情被重寫非靜態方法和使用裏面的靜態的(這是UserManagerService類中)修復:靜態和非靜態版本的C#中的相同功能#

public override string GetUserId(ClaimsPrincipal user) 
{ 
    return GetUserIdStatic(user); 
} 

public static string GetUserIdStatic(ClaimsPrincipal user) 
{ 
    return user.FindFirst(ClaimTypes.NameIdentifier).Value; 
} 

我沒有,因爲我更喜歡稱之爲非靜態上下文中的非靜態方法(通常超過90%的調用)。所以我更喜歡每當我可以的時候打電話_userManagerService.GetUserId(User)而不是UserManagerService.GetUserIdStatic(User)

從可讀性和可維護性的角度來看(以及我目前無法預見的最終有害後果)是否更好地按照上述方式進行;將所有呼叫切換到靜態版本;或者我沒有想過的其他方式?

回答

2

做一個靜態和非靜態版本的方法,做同樣的事情是非常可疑的。

您應該更換靜態方法以獲取用戶標識以獲取用戶管理器服務的靜態方法或靜態屬性。這將讓你通過調用非靜態方法獲得靜態上下文用戶ID:

var userId = StaticGetUserManagerSerice().GetUserIdStatic(user); 

var userId = UserManagerSerice.Instance.GetUserIdStatic(user); 
+0

這是一個很好的答案,但是你不應該對某種類型使用'var' –

+0

謝謝你的建議。它看起來像一個更好的解決方案,雖然我不知道如何自己實例化UserManagerService對象,因爲構造函數接受了多個我沒有明確控制的參數,而且在其他地方,DI爲我處理這件事(我從不實例化反對我自己)。但我認爲這可能超出了這個問題的範圍。 – m3h0w

+1

@AidanConnelly使用'var'可以幫助您避免重複您已經在別處提供的信息,例如方法的返回類型。爲了簡潔和一致,我在任何地方都使用'var'。 – dasblinkenlight

1

首先,它不清楚你把哪一個階級在這個靜態和非靜態方法。

看來你的方法是什麼所謂的「純函數」,也就是說,它只是返回同樣的事情,不管輸入並且沒有副作用。在這種情況下,該方法不適用於實例,因爲它不處理實例的數據。所以從這個角度來看,電話應該是靜態的。

但是,根據OOP原則,這種方法的最佳位置似乎是User類,作爲非靜態方法。

+0

我說哪裏的功能被實現小評。 我同意,它並沒有明顯的意義,它是一個實例方法,但它看起來像一個可讀性改進,因爲幾乎所有由該類的方法執行的操作都是使用正在注入的實例執行的。 – m3h0w