我正在寻找避免构造函数注入过度使用的最佳做法。比如我有会议其中有几个子实体实体像图所示:构造函数注入过度使用
- 会议
- MeetingContacts
- MeetingAttendees
- MeetingType
- 地址
- MeetingCompanies
- MeetingNotes
MeetingService类看起来象下面这样:
public class MeetingService
{
private readonly IMeetingContactRepository _meetingContactRepository;
private readonly IMeetingAttendeeRepository _meetingAttendeeRepository;
private readonly IMeetingTypeRepository _meetingTypeRepository;
private readonly IAddressRepository _addressRepository;
private readonly IMeetingCompanyRepository _meetingCompanyRepository;
private readonly IMeetingNoteRepository _meetingNoteRepository;
private readonly IMeetingRepositoy _meetingReposity;
public MeetingService(IMeetingRepositoy meetingReposity, IMeetingContactRepository meetingContactRepository, IMeetingAttendeeRepository meetingAttendeeRepository,
IMeetingTypeRepository meetingTypeRepository, IAddressRepository addressRepository,
IMeetingCompanyRepository meetingCompanyRepository, IMeetingNoteRepository meetingNoteRepository)
{
_meetingReposity = meetingReposity;
_meetingContactRepository = meetingContactRepository;
_meetingAttendeeRepository = meetingAttendeeRepository;
_meetingTypeRepository = meetingTypeRepository;
_addressRepository = addressRepository;
_meetingCompanyRepository = meetingCompanyRepository;
_meetingNoteRepository = meetingNoteRepository;
}
public void SaveMeeting(Meeting meeting)
{
meetingReposity.Save();
if(Condition1())
_meetingContactRepository.Save();
if(Condition2())
_meetingAttendeeRepository.Save();
if(Condition3())
_meetingTypeRepository.Save();
if(Condition4())
_addressRepository.Save();
if(Condition5())
_meetingCompanyRepository.Save();
if(Condition6())
_meetingNoteRepository.Save();
}
//... other methods
}
这里有短短七年的依赖,但真正的代码包含更多的人。我使用了"Dependency Injection Constructor Madness"中描述的不同技术,但我还没有找到如何处理存储库依赖关系。
有什么办法可以减少依赖关系的数量并保持代码的可测性?
创建一个MeetingConfiguration类,其中构造函数为您“放牧猫”。然后,您可以将MeetingConfiguration类传递给您正在初始化的任何内容。你不会解决多重过载的问题,但至少所有的重载都在一个地方。 – 2012-06-16 21:51:12
如果你真的在这个'MeetingService'中写信给所有的存储库,它肯定会做很多事情。把'MeetingService'分成只有共享密钥的其他服务怎么办?我的意思是,你的工作单位是什么?如果会议在'meetingReposity.Save();'后完成,然后发起一个事件并让所有其他人订阅。 –
我认为@ dtryon的建议要好得多。我不喜欢创建“配置”类的想法,只是为了隐藏你实际上有很多依赖关系。这只会让代码不那么清晰,但没有更好的组织。 –