如何在C#IComparer类中注入存储库?

如何在C#IComparer类中注入存储库?,c#,icomparer,C#,Icomparer,我需要按问题的排序顺序来排序 一个名为Questions的表将排序顺序信息存储在QuestionId和SortOrder中 另一个表应用程序问题包含所有问题和答案,通过问题ID引用第一个表 所以基本上我们想根据另一个列表对列表进行排序 public class QuestionOrderComparer : IComparer<int> { private readonly IRepository<Question> _Questions; public

我需要按问题的排序顺序来排序

一个名为Questions的表将排序顺序信息存储在QuestionIdSortOrder

另一个表应用程序问题包含所有问题和答案,通过问题ID引用第一个表

所以基本上我们想根据另一个列表对列表进行排序

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