私の述語構築コードが似ていることに気付き始めました。それはそれをリファクタリングする兆候です。コードを見てみましょう。
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();
このコードは、ユーザーが記事の「いいね」ボタンを押したかどうかを確認する必要があるときに実行されます。私が使用するユーザーを追跡するには
- Cookie からのスパイ GUID キー
- IPアドレス
- ログインしている場合は UserId
データベース内の記事に「好きな投票」を挿入する ajax 呼び出しを発行すると、同じコードが実行されます。
だから私はそれをカプセル化したいと思います。私の最初のアイデアは、拡張メソッドのアプローチを選択することでしたが、そのようなサービスへの参照を取得するには ServiceLocator パターンに頼らなければならないので、私はそれが好きではありません
IUserKeyService service = ServiceLocator.Current.GetInstance<IUserKeyService>();
テストできないので、それは悪い設計だと思います。再利用可能であると同時に、DI コンテナーによって制御できるクラスが必要です。依存関係を注入できるクラス。出来ますか ?