Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PredicateBuilder/LINQ封装谓词,DI_C#_Linq_Dependency Injection_Predicatebuilder - Fatal编程技术网

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按钮”时,就会运行此代码。 跟踪我使用的用户

  • 来自cookie的间谍guid密钥
  • Ip地址
  • 用户ID(如果他已登录)
  • 当我发出ajax调用在数据库中为一篇文章插入“like vote”时,会运行相同的代码

    所以我想把它封装起来。我的第一个想法是选择extensions方法,但我不喜欢它,因为我将不得不求助于ServiceLocator模式来获取对类似服务的引用

    IUserKeyService service = ServiceLocator.Current.GetInstance<IUserKeyService>();
    
    IUserKeyService service=ServiceLocator.Current.GetInstance();
    
    我觉得这将是一个糟糕的设计,因为它不可测试。我希望有一个可重用的类,同时可以由DI容器控制。我可以向其中注入依赖项的类。 可能吗