PredicateBuilder / LINQ封装谓词,DI

时间:2012-01-27 09:25:17

标签: 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.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”时,此代码运行。 要跟踪我使用的用户

  1. 来自cookie的间谍guid键
  2. Ip地址
  3. UserId,如果他已登录
  4. 当我发出ajax调用以在数据库中插入“like vote”时,相同的代码就会运行。

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

    IUserKeyService service = ServiceLocator.Current.GetInstance<IUserKeyService>();
    

    我认为这将是一个糟糕的设计,因为它不可测试。我希望有一个可重复使用的类,同时可以通过DI容器控制。我可以将依赖注入的类。 有可能吗?

0 个答案:

没有答案