我有一个项目,我遇到循环引用问题。
我有一个“事件”对象,其中我可以有一个“问题”对象列表 我有一个“问题”对象,我可以从中获取父“事件”。
如果我使用的是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,如果它可以提供任何帮助。
由于
答案 0 :(得分:1)
我可以建议你做错了吗?在我看来,当涉及到存储库时,您违反了“关注分离”原则。
问题存储库的工作不是为您提供作为父对象的Event对象,而仅仅是eventId,用户可以从中查询EventRepository以获取Event对象。同样,对于其他存储库。这样,您就不必绕过传递依赖关系,但可以撰写您的请求,例如:
var question = _questionRepo.GetNew(row);
var evnt = _eventRepo.Get(question.IdEvent);
此外,Autofac不正式支持循环构造函数\构造函数依赖项,因为您可以阅读here。
另一种解决方案是将其中一个依赖项更改为Property setter,然后按照文档中的说明继续。