LinqToSQl и централизованная адаптация от linq к объектам домена - PullRequest
0 голосов
/ 23 декабря 2008

Представьте себе следующий код:

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 Ответ

0 голосов
/ 18 июля 2013

Я бы сделал это, используя класс 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];
    }
}
...