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领域。 –