LinqToSQl и централизованная адаптация от linq к объектам Domain
Представьте себе следующий код:
return from a in DBContext.Acts
join artist in DBContext.Artists
on a.ArtistID equals artist.ID into art
from artist in art.DefaultIfEmpty()
select new Shared.DO.Act {
ID = a.ID,
Name = a.Name,
Artist = new Shared.DO.Artist {
ID = artist.ID,
Name = artist.Name
},
GigId = a.GigID
};
Как видите, сгенерированный объектом действия linqtosql объект адаптирован в объект Shared.DO.Act. В рамках этого объект Artist сгенерированный linqtosql адаптируется в Shared.DO.Artist
В другом месте моей базы кода я могу запросить исполнителя (см. Ниже):
return from a in DBContext.Artists
select new Shared.DO.Artist {
ID = artist.ID,
Name = artist.Name
},
GigId = a.GigID
};
Это означает, что код доступа для артиста теперь появляется в двух местах! Один раз при получении художника, а также когда загружен акт
Как мне централизовать этот код адаптации?
1 ответ
Я бы сделал это, используя класс Artists со словарем художников:
public class Artists
{
// key should be whatever type artist.ID is
private Dictionary<int, Shared.DO.Artist> _artistDictionary;
public static Get(int id)
{
if (_artistDictionary == null)
_artistDictionary = new Dictionary<int, Shared.DO.Artist>();
if (!_artistDictionary.ContainsKey(id))
{
var artist = from a in DBContext.Artists
on a.ID equals id
select new Shared.DO.Artist {
ID = a.ID,
Name = a.Name
};
_artistDictionary.Add(id, artist);
}
return _artistDictionary[id];
}
}