После обновления до DNN 5.5.0 нам пришлось реализовать IHydratable
на всех наших бизнес-объектах.
Поначалу эта идея казалась хорошим вариантом, но после игры с IHydratable
я уже не уверен.
Есть две возможности:
- Я делаю это неправильно
IHydratable
заставляет вас использовать select *
построить все ваши запросы
Бизнес-кейс:
- Мой первый sproc возвращает
BgId
и BgShortDesc
- Мой второй sproc возвращает
BgId
и BgReportedUser
My IHydratable
реализовано, как показано ниже:
public class Bug : IHydratable
{
public int BgId { get; set; }
public string BgShortDesc { get; set; }
public int BgReportedUser { get; set; }
public DateTime BgReportedDate { get; set; }
public Bug() { }
public int KeyID
{
get { return BgId; }
set { BgId = value; }
}
public void Fill(IDataReader dr)
{
BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
BgShortDesc = Convert.ToString(Null.SetNull(dr["BgShortDesc"], BgShortDesc));
BgReportedUser = Convert.ToInt32(Null.SetNull(dr["BgReportedUser"], BgReportedUser));
BgReportedDate = Convert.ToDateTime(Null.SetNull(dr["BgReportedDate"], BgReportedDate));
}
}
Метод fill выдаст IndexOutOfRangeException
для любого из вышеперечисленных sprocs, поскольку не все поля возвращаются с IDataReader
.
Самый простой способ решить эту проблему - использовать select *
во всех sprocs, но это не очень хорошая практика.
Какой правильный способ реализации IHydratable
в этом сценарии?
P.S. Имейте в виду, что мой пример упрощен, чтобы объяснить суть.