2014-05-07 144 views
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<>参数传递,但由于提取方法具有不同的参数,所以我没有把它做对。

哪些这里是我的选择吗?

+0

我读过直到该行:'user = dependencyResolver.UserRepository.GetByUserName(userName);'你在哪里违反demeter的法则。首先修复它 –

+0

有趣的评论@AlmaDo。 'dependencyReslover'只返回存储库接口。我可以写'IUserRepository userRepository = dependencyResolver.UserRepository; userRepository.GetByUserName(userName);''dependencyResolver'被传递给服务的构造函数。我知道我不应该相信朋友的朋友,但是'dependencyResolver'和'UserRepository'更像是朋友而不是朋友。我可以相信一个朋友的兄弟,或者这仍然违反德米特法吗? – FatAlbert

+0

我相信你想要做的是封装一个[横切关注](http://en.wikipedia.org/wiki/Cross-cutting_concern)。请注意,在这一点上你实际上已经超越了OOP领域并进入了AOP领域。 –

回答

0

取代:

if (user == null) return null; 

     AddStuffToUser(); 

     return user; 

有:

return doXYZ(user); 

,并添加:

private User doXYZ(User user){ 
    if (user != null){ 
     AddStuffToUser(); 
     return user;} 
    return null; 

在这点u放置6行9和更好的代码风格(OOP-标准是有用的在任何任务)

+0

感谢您的回复。问题中的例子很简单,可以 - 如您所建议 - 重构。但是,我正在寻找一个更通用的解决方案,以便在您希望删除流逻辑的重复时使用。 – FatAlbert