如何在C#IComparer类中注入存储库?
我需要按问题的排序顺序来排序 一个名为Questions的表将排序顺序信息存储在QuestionId和SortOrder中 另一个表应用程序问题包含所有问题和答案,通过问题ID引用第一个表 所以基本上我们想根据另一个列表对列表进行排序如何在C#IComparer类中注入存储库?,c#,icomparer,C#,Icomparer,我需要按问题的排序顺序来排序 一个名为Questions的表将排序顺序信息存储在QuestionId和SortOrder中 另一个表应用程序问题包含所有问题和答案,通过问题ID引用第一个表 所以基本上我们想根据另一个列表对列表进行排序 public class QuestionOrderComparer : IComparer<int> { private readonly IRepository<Question> _Questions; public
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;
}
}
intellisense要求我为IRepository
添加一些参数
如何处理?是否可以在
IComparer
类中进行注入?转储比较器,并将该代码放入问题集合对象中的排序方法中
这段代码将比较和排序混为一谈。传统上,类会将比较器重写为,或具有客户比较器。net framework知道在对一组问题调用sort
时使用此选项。“比较”方法应该是比较-返回-1,0,1(分别小于、等于、大于)-不进行实际排序。我可以看到LINQ改变了这种模式,但是,Compare
进行排序似乎与框架背道而驰。然后,问题
集合应该有一个比较器,反之亦然。在工厂后面隐藏存储库怎么样?结构图将为您解决所有问题
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
公共类问题OrderComparerFactory:IQuestionOrderComparerFactory
{
私人回答问题;
公共问题OrderComparerFactory(i假设性问题)
{
_问题=问题;
}
PublicQuestionOrderComparer创建()
{
返回新的QuestionOrderComparer(_个问题);
}
}
这组应用程序问题.OrderBy(x=>x.QuestionId,_comparerFactory.Create());//比较器工厂是通过构造函数注入的
顺便说一句,我不会把这个逻辑放在比较器中,除非你想在很多地方重用它。我一直想在没有任何外部依赖的非常简单的情况下使用comparer。您的构造函数需要一个IRepository
参数。您需要将一个传递到构造函数中。它不是应该由我的StructureMap自动解析吗?调用OrderBy
的类是否已经有一个注入的IRepository
实例?如果您使用的是纯DI(也就是说,有一个组合根,其中所有内容都被注入),那么所有依赖项都应该通过构造函数注入,并传递到更深层的内部类。否则,您可以使用服务定位器来解析比较器(然而,它不是纯DI)。@Groo,我希望问题按照标准顺序构造到IComparer
类中。调用方只有IRepository
。不是IRepository
。我想到的第一件事是调用方应该在其构造函数中随IRepo
一起有一个IRepository
参数。但一件相当奇怪的事情是,每次调用Compare
似乎都会在每次调用中获取整个问题表(假设您在幕后使用EF或NHibernate)。您的ORM不支持自动LINQ到DB连接吗?例如,简单地.OrderBy(x=>x.ParentQuestion.SortOrder)
,其中ParentQuestion
通过ORM映射到右侧的问题
实例?这会将整个查询转换为单个DB select。
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