2016-12-16 62 views
1

我需要按排序順序排序問題。如何在C#IComparer類中注入存儲庫?

一個名爲問題專賣店在QuestionIdSortOrder的排序順序信息。

其他表ApplicantQuestions包含了所有的問題和答案,參考第一臺由QuestionId

所以基本上我們想基於另一個列表對列表進行排序。

public class QuestionOrderComparer : IComparer<int> 
{ 
    private readonly IRepository<Question> _Questions; 

    public QuestionOrderComparer(IRepository<Question> Questions) 
    { 
     _Questions = Questions; 
    } 

    public int Compare(int x, int y) 
    { 
     var questionsInOrder = _Questions.All 
      .Select(q => new QuestionOrderModel(q.QuestionId, q.SortOrder)) 
      .ToList(); 

     var xValue = questionsInOrder.FirstOrDefault(q => q.Id == x)?.SortOrder ?? 0; 
     var yValue = questionsInOrder.FirstOrDefault(q => q.Id == y)?.SortOrder ?? 0; 
     return xValue - yValue; 
    } 
} 

這看起來很好,但是當我嘗試使用它

thisSetOfApplicantQuestions 
    .OrderBy(x => x.QuestionId, new QuestionOrderComparer()); 

智能感知需要我補充一些參數IRepository<Question>

如何處理?是否可以在IComparer課程中注射?

+1

您的構造函數需要一個'IRepository '參數。你需要將一個傳遞給構造函數。 –

+0

是不是應該由我的StructureMap自動解決? – Blaise

+0

調用'OrderBy'的類是否已經注入了'IRepository'實例?如果你使用的是純粹的DI(即有一個組成部分是所有東西都被注入的),那麼所有的依賴關係應該通過構造函數注入,並且深入到內部類中。否則,您可以使用服務定位器來解析比較器(但不是純粹的DI)。 – Groo

回答

1

將工廠隱藏在工廠後面呢?結構圖將爲您解決所有問題。

public class QuestionOrderComparerFactory : IQuestionOrderComparerFactory 
    { 
     private IRepository<Question> _questions; 

     public QuestionOrderComparerFactory(IRepository<Question> questions) 
     { 
      _questions = questions; 
     } 

     public QuestionOrderComparer Create() 
     { 
      return new QuestionOrderComparer(_questions); 
     } 

    } 



    thisSetOfApplicantQuestions.OrderBy(x => x.QuestionId, _comparerFactory.Create()); // comparer factory is injected via constructor 

btw我不會把這個邏輯放在比較器中,除非你想在很多地方重用它。我一直認爲在非常簡單的情況下使用比較器沒有任何外部依賴性。

1

轉儲比較器並將該代碼放在Sort方法中的問題集合對象中。

此代碼正在混合比較和排序。傳統上,課程優先於CompareTo,或者有客戶比較器。 .net框架知道在調用問題集合sort時使用這個。 「比較」方法應該比較 - 返回-1,0,1(小於,等於,大於,分別) - 不進行實際排序。我可以看到LINQ改變了這種模式,但是仍然在做排序工作似乎與框架有關。然後,Questions集合應該有一個比較器,而不是相反。

相關問題