Autofac,循环引用和解析外键的设计

时间:2016-11-21 22:32:35

标签: c# dependency-injection inversion-of-control autofac circular-dependency

我有一个项目,我遇到循环引用问题。

我有一个“事件”对象,其中我可以有一个“问题”对象列表 我有一个“问题”对象,我可以从中获取父“事件”。

如果我使用的是Entity Framework,它将由Framework管理,但出于某种原因,我要求不要使用Entity Framework来自我的客户端。所以,我试图模拟EF行为,因为我很确定他们最终会理解并让我使用EF。这是我如何进行

public class EventRepository : AbstractRepository<Event>, IEventRepository
{
    private readonly IQuestionRepository questionRepository;
    public EventRepository(IContext context, IQuestionRepository questionRepository)
    {
        this.questionRepository = questionRepository;
    }

    public Event GetNew(DataRow row)
    {
        return new GeEvent(this.questionRepository) { // Load the event from the datarow }
    }

    public class GeEvent : Event
    {
        private readonly IQuestionRepository questionRepository;
        public GeEvent(IQuestionRepository questionRepository)
        {
            this.questionRepository = questionRepository;
        }
        public override List<Question> Questions { get { return this.questionRepository.GetByIdEvent(this.IdEvent); }}
    }
}

public class QuestionRepository : AbstractRepository<Question>, IQuestionRepository
{
    private readonly IEventRepository eventRepository;
    public QuestionRepository(IContext context, IEventRepository eventRepository)
    {
        this.eventRepository = eventRepository;
    }

    public Question GetNew(DataRow row)
    {
        return new GeQuestion(this.eventRepository) { // Load the question from the datarow }
    }

    public class GeQuestion : Question
    {
        private readonly IEventRepository eventRepository;
        public GeQuestion(IEventRepository eventRepository)
        {
            this.eventRepository = eventRepository;
        }
        public override Event Event { get { return this.eventRepository.Get(this.IdEvent); }}
    }
}

所以,正如你所看到的,我有一个“鸡或鸡蛋”的案例。要创建EventRepository,它需要一个QuestionRepository并创建一个QuestionRepository,它需要一个EventRepository。除了直接使用DependencyResolver,这将使存储库(和服务)无法正确测试,我如何管理依赖项,以便我可以加载我的外键“a la”实体框架?

顺便说一句,我简化了外键的“延迟加载”以保持样本简单。

BTW2我使用Autofac,如果它可以提供任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

我可以建议你做错了吗?在我看来,当涉及到存储库时,您违反了“关注分离”原则。

问题存储库的工作不是为您提供作为父对象的Event对象,而仅仅是eventId,用户可以从中查询EventRepository以获取Event对象。同样,对于其他存储库。这样,您就不必绕过传递依赖关系,但可以撰写您的请求,例如:

var question = _questionRepo.GetNew(row);
var evnt = _eventRepo.Get(question.IdEvent);

此外,Autofac不正式支持循环构造函数\构造函数依赖项,因为您可以阅读here

另一种解决方案是将其中一个依赖项更改为Property setter,然后按照文档中的说明继续。