1
我有一個服務/經理類,我從數據源中獲取用戶。這些方法是模擬流程,但有不同的檢索方法。如何刪除流邏輯的重複?
public User GetByUserName(string userName)
{
user = dependencyResolver.UserRepository.GetByUserName(userName);
if (user == null) return null;
AddStuffToUser();
return user;
}
public User GetById(int id)
{
user = dependencyResolver.UserRepository.GetById(id);
if (user == null) return null;
AddStuffToUser();
return user;
}
public User GetByUserName(string userName, string encryptedPassword)
{
user = dependencyResolver.UserRepository.GetByUsernameAndPassword(userName, encryptedPassword);
if (user == null) return null;
AddStuffToUser();
return user;
}
我想刪除的流程邏輯的重複,但我不能找到滿意的設計。我可以通過使用OOP來實現,但我認爲這對於這樣一個簡單的任務來說增加了很多複雜性。我也嘗試將提取方法作爲Func<>
參數傳遞,但由於提取方法具有不同的參數,所以我沒有把它做對。
哪些這裏是我的選擇嗎?
我讀過直到該行:'user = dependencyResolver.UserRepository.GetByUserName(userName);'你在哪裏違反demeter的法則。首先修復它 –
有趣的評論@AlmaDo。 'dependencyReslover'只返回存儲庫接口。我可以寫'IUserRepository userRepository = dependencyResolver.UserRepository; userRepository.GetByUserName(userName);''dependencyResolver'被傳遞給服務的構造函數。我知道我不應該相信朋友的朋友,但是'dependencyResolver'和'UserRepository'更像是朋友而不是朋友。我可以相信一個朋友的兄弟,或者這仍然違反德米特法嗎? – FatAlbert
我相信你想要做的是封裝一個[橫切關注](http://en.wikipedia.org/wiki/Cross-cutting_concern)。請注意,在這一點上你實際上已經超越了OOP領域並進入了AOP領域。 –