我正在尋找避免構造函數注入過度使用的最佳做法。比如我有會議其中有幾個子實體實體像圖所示:構造函數注入過度使用
- 會議
- 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的建議要好得多。我不喜歡創建「配置」類的想法,只是爲了隱藏你實際上有很多依賴關係。這隻會讓代碼不那麼清晰,但沒有更好的組織。 –