2

我有一個項目,我遇到了循環引用問題。Autofac,循環引用和設計解決外鍵問題

我有一個「事件」對象,我可以有一個「問題」對象列表 我有一個「問題」對象,我可以從中獲取父「事件」。

如果我使用實體框架,它將由框架管理,但我有一個要求,不要使用實體框架,出於某種原因,從我的客戶。所以,我試圖模擬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(這會使存儲庫(和服務)無法正確測試)之外,我如何管理依賴關係,以便可以加載我的外鍵「一個」實體框架?

順便說一句,我已簡化了外鍵的「延遲加載」,以保持示例簡單。

BTW2我使用Autofac,如果它可以幫助任何事情。

謝謝

回答

0

我可以建議你做你的設計錯了嗎?在我看來,當涉及到存儲庫時,你違反了分離關注原則。

問題存儲庫的工作不是爲您提供父對象的Event對象,而僅僅是用戶可以從中查詢EventRepository以獲取事件對象的eventId。同樣,對於其他存儲庫。這樣,你不必到處傳遞的依賴關係,但可以撰寫你的要求,如:

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

此外,Autofac不正式支持圓形構造\構造depencies,你可以閱讀here

另一種解決方案是將其中一個依賴項更改爲屬性設置器,然後按照文檔中的說明進行操作。

+0

感謝您的回答。我知道,設計並不理想。我通常會使用實體框架,但客戶完全反對,因爲他說,他的程序員已經有很多東西要學,EF會太過分了......嗯...... EF會照顧所有這些非 - 但是你知道......客戶是國王。 我認爲我必須去財產二傳手,直到客戶端來到它的感官,並允許我使用EF。 再次感謝您的答案。 –