我开始注意到我的谓词构建代码看起来很相似。这是重构它的标志。我们来看看代码。
var predicate = PredicateBuilder.False<ArticleLikeInfo>();
// Under the covers it will get Guid from a cookie (one way to track a user)
Guid? key = _userKeyService.GetKey();
if (key.HasValue)
{
predicate = predicate.OrElse(x => x.UserKey == key.Value);
}
String ip = Request.UserHostAddress;
if (!String.IsNullOrEmpty(ip))
{
predicate = predicate.OrElse(x => x.UserIp == ip);
}
UserInfo user = _userSessionService.CurrentUser();
if (user != null)
{
predicate = predicate.OrElse(x => x.UserId == user.Id);
}
bool hasVoted = _articleService.GetLikes().Where(x => x.ArticleId == m.Id)
.Where(predicate)
.Any();
当我需要检查用户是否在文章上按下“like button”时,此代码运行。 要跟踪我使用的用户
当我发出ajax调用以在数据库中插入“like vote”时,相同的代码就会运行。
所以我想把它封装起来。我的第一个想法是选择扩展方法方法,但我不喜欢它,因为我将不得不求助于ServiceLocator模式来获取对此类服务的引用
IUserKeyService service = ServiceLocator.Current.GetInstance<IUserKeyService>();
我认为这将是一个糟糕的设计,因为它不可测试。我希望有一个可重复使用的类,同时可以通过DI容器控制。我可以将依赖注入的类。 有可能吗?