2

У меня есть проект, в котором я столкнулся с круглой справочной проблемой.Autofac, круговые ссылки и дизайн для разрешения внешних ключей

У меня есть объект «Событие», в котором у меня может быть список объектов «Вопрос» У меня есть объект «Вопрос», из которого я могу получить родительское «Событие».

Если бы я использовал 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» Entity Framework?

BTW, я упростил «ленивую загрузку» внешних ключей, чтобы сохранить образец простым.

BTW2 Я использую Autofac, если он может помочь во что угодно.

Thanks

ответ

0

Могу ли я предположить, что вы неправильно делаете свой проект? Мне кажется, что вы нарушаете принцип «Разделение проблем», когда речь заходит о репозитории.

Задача репозитория вопроса заключается не в том, чтобы предоставить объект Event, который является родительским, а просто eventId, из которого пользователь может запросить EventRepository для получения объекта события. Аналогично, для другого репозитория. Таким образом, вы не должны идти вокруг прохождения зависимости, но можете составить ваши запросы, такие как:

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

Кроме того, Autofac официально не поддерживает круговой конструктор \ конструктора depencies, как вы можете прочитать here.

Другим решением является изменение одной из зависимостей на Property setter и последующее действие, как показано в документе.

+0

Спасибо за ответ. Я знаю, дизайн менее идеален. Я бы обычно использовал Entity Framework, но клиент абсолютно против этого, потому что, по его словам, его программистам уже так много нужно учиться, EF будет слишком далеко ... Ну ... EF позаботится обо всем этом, -чувствительность, но вы знаете ... клиент король. Думаю, мне придется идти за установщиком недвижимости, пока клиент не опомнится и не позволит мне использовать EF. Еще раз спасибо за ответ. –