C# PredicateBuilder/LINQ封装谓词,DI
我开始注意到我的谓词构建代码看起来很相似。这是重构它的标志。让我们看看代码C# PredicateBuilder/LINQ封装谓词,DI,c#,linq,dependency-injection,predicatebuilder,C#,Linq,Dependency Injection,Predicatebuilder,我开始注意到我的谓词构建代码看起来很相似。这是重构它的标志。让我们看看代码 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.HasValu
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();
var predicate=PredicateBuilder.False();
//在封面下,它将从cookie中获取Guid(跟踪用户的一种方法)
Guid?key=_userKeyService.GetKey();
if(key.HasValue)
{
谓词=谓词.OrElse(x=>x.UserKey==key.Value);
}
字符串ip=Request.UserHostAddress;
如果(!String.IsNullOrEmpty(ip))
{
predicate=predicate.OrElse(x=>x.UserIp==ip);
}
UserInfo user=\u userSessionService.CurrentUser();
如果(用户!=null)
{
谓词=谓词.OrElse(x=>x.UserId==user.Id);
}
bool hasvated=\u articleService.GetLikes()。其中(x=>x.ArticleId==m.Id)
.Where(谓词)
.Any();
当我需要检查用户是否按下了文章上的“like按钮”时,就会运行此代码。
跟踪我使用的用户
IUserKeyService service = ServiceLocator.Current.GetInstance<IUserKeyService>();
IUserKeyService service=ServiceLocator.Current.GetInstance();
我觉得这将是一个糟糕的设计,因为它不可测试。我希望有一个可重用的类,同时可以由DI容器控制。我可以向其中注入依赖项的类。
可能吗