2016-01-14 3 views
0

У меня возникла проблема с «переносом» результатов класса уровня DAL в мой класс BLL с тем же определением.Невозможно наложить объект типа «Класс DAL» на тип «BLL Class»

Ошибка: «Невозможно наложить объект типа« DeserializedGame »на« DeserializedGameBLL ».»

//DAL Classes 
public class GameCollection{ 
    public List<DeserializedGame> Games { get; set; } 
    public int RefreshInterval { get; set; } 
    public string CurrentDate { get; set; } 
    public string NextDate { get; set; } 
    public string PrevDate { get; set; } 
} 

public class DeserializedGame 
{ 
    public string Atcommon { get; set; } 
    public string Canationalbroadcasts { get; set; } 
    public string Ata { get; set; } 
    public bool Rl { get; set; } 
    public int Atsog { get; set; } 
    public string Bs { get; set; } 
    public string Htcommon { get; set; } 
    public int Id { get; set; } 
    public string Atn { get; set; } 
    public int Hts { get; set; } 
    public string Atc { get; set; } 
    public string Htn { get; set; } 
    public string Usnationalbroadcasts { get; set; } 
    public bool Gcl { get; set; } 
    public string Hta { get; set; } 
    public int? Ats { get; set; } 
    public string Htc { get; set; } 
    public int Htsog { get; set; } 
    public string Bsc { get; set; } 
    public int Gs { get; set; } 
    public bool Gcll { get; set; } 
} 

//BLL Classes 
public class GameCollectionBLL : IEnumerable 
{ 
    public List<DeserializedGame> Games { get; set; } 
    public int RefreshInterval { get; set; } 
    public string CurrentDate { get; set; } 
    public string NextDate { get; set; } 
    public string PrevDate { get; set; } 

    public GameCollectionBLL(List<DeserializedGame> gameList, int refreshInterval, string currentDate, 
     string nextDate, string previousDate) 
    { 
     this.Games = gameList; 
     this.RefreshInterval = refreshInterval; 
     this.CurrentDate = currentDate; 
     this.NextDate = nextDate; 
     this.PrevDate = previousDate; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return (Games as IEnumerable).GetEnumerator(); 
    } 
} 

public class DeserializedGameBLL : BaseSeasonSchedule 
{ 
    public string Atcommon { get; set; } 
    public string Canationalbroadcasts { get; set; } 
    public string Ata { get; set; } 
    public bool Rl { get; set; } 
    public int Atsog { get; set; } 
    public string Bs { get; set; } 
    public string Htcommon { get; set; } 
    public int Id { get; set; } 
    public string Atn { get; set; } 
    public int Hts { get; set; } 
    public string Atc { get; set; } 
    public string Htn { get; set; } 
    public string Usnationalbroadcasts { get; set; } 
    public bool Gcl { get; set; } 
    public string Hta { get; set; } 
    public int? Ats { get; set; } 
    public string Htc { get; set; } 
    public int Htsog { get; set; } 
    public string Bsc { get; set; } 
    public int Gs { get; set; } 
    public bool Gcll { get; set; } 
} 

public abstract class BaseSeasonSchedule 
{ 
    public int GameID { get; set; } 
    public DateTime GameDate { get; set; } 
} 

//UI usage 
public partial class Form1 : Form 
{ 
    private SeasonSheduleBLL objSeasonSchedule = new SeasonSheduleBLL(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
      GameCollectionBLL gameDay = objSeasonSchedule.GetGameCollection(json_string); 

      foreach (DeserializedGameBLL game in gameDay) //error occurs here when referencing the DeserialzedGameBLL 
        { 
         // do stuff here 
        } 
    } 
} 

Что нужно сделать, чтобы моя коллекция DeserialzedGame работала правильно?

Я просмотрел this question (и попытался выполнить @Measuring совет в исходном посте). Я рассмотрел (и до сих пор не устранил using DTO's, но я не уверен, как правильно их использовать).

Если это принадлежит к разделу Code Review, я, скорее всего, отправлю туда, но я думал, что люди могут испытывать такое же разочарование, какое я есть.

+0

Используйте Automapper или другую библиотеку для сопоставления объектов в ваших слоях. –

+0

Ошибка говорит вам, что вы не можете неявно бросить между двумя несвязанными типами. Вам нужно будет создать новый экземпляр целевого типа и установить его свойства в соответствии с типом источника. Но ... Почему у вас есть два одинаковых типа? Просто используйте один из них по всей системе и удалите другой. – David

+0

@ David Правильно ли было бы предположить, что ваше предложение - это то, что все DTO? – Kulstad

ответ

0

Вы можете использовать библиотеку, такую ​​как Automapper, или можете сделать это сами, используя ключевое слово explicit.

public class DeserializedGame 
{ 
    public string Atcommon { get; set; } 
    public string Canationalbroadcasts { get; set; } 
    public string Ata { get; set; } 
    public bool Rl { get; set; } 
    public int Atsog { get; set; } 
    public string Bs { get; set; } 
    public string Htcommon { get; set; } 
    public int Id { get; set; } 
    public string Atn { get; set; } 
    public int Hts { get; set; } 
    public string Atc { get; set; } 
    public string Htn { get; set; } 
    public string Usnationalbroadcasts { get; set; } 
    public bool Gcl { get; set; } 
    public string Hta { get; set; } 
    public int? Ats { get; set; } 
    public string Htc { get; set; } 
    public int Htsog { get; set; } 
    public string Bsc { get; set; } 
    public int Gs { get; set; } 
    public bool Gcll { get; set; } 
    public static implicit operator DeserializedGameBLL(DeserializedGame game) 
    { 
     return new DeserializedGameBLL() 
     { 
      pubAtcommon = pubAtcommon, 
      Canationalbroadcasts= Canationalbroadcasts, 
      Ata = Ata , 
      Rl = Rl , 
      Atsog = Atsog , 
      Bs = Bs , 
      Htcommon = Htcommon , 
      Id = Id , 
      Atn =Atn , 
      Hts =Hts , 
      Atc =Atc , 
      Htn =Htn, 
      Usnationalbroadcasts =Usnationalbroadcasts, 
      Gcl =Gcl, 
      Hta =Hta, 
      Ats =Ats, 
      Htc =Htc, 
      Htsog = Htsog, 
      Bsc = Bsc, 
      Gs = Gs, 
      Gcll = Gcll 
     }; 
    } 
} 

Вы могли бы использовать это так:

DeserializedGame b = new DeserializedGame(); 
DeserializedGameBLL c = b; 

Вы также можете использовать оператор explicit и сделать это так, что вам не нужно слепок, а если вы не хотите автоматические преобразования.

+0

Не добавлял ли '' публичный статический неявный оператор в класс 'DeserializedGame' в DAL, чтобы потребность в классе DAL знать о классе BLL? – Kulstad

+0

@ Kulstad да, это было бы, но это было бы не иначе, как использование Automapper или подобных библиотек. – Jetti

1

Ошибка просто говорит вам, что вы не можете неявно конвертировать между двумя несвязанными типами. Просто потому, что они выглядят идентичны, это не значит, что они одного типа. Чтобы исправить это, вам нужно создать экземпляр целевого типа и скопировать все данные из исходного объекта в целевой объект. (Или использовать библиотеку как Automapper сделать то же самое.)

Однако, это действительно напрашивается вопрос ... Почему у вас идентичных типов в первую очередь?

[на основе замечаний по выше вопросу ...] Похоже, что у вас есть архитектура, как это:

  • Применения ссылка слоя бизнес-слой.
  • Слой данных уровня бизнес-уровня.
  • Нигде нет слоя данных.

Так что же происходит,:

  • слой данных имеет тип, поэтому он может материализовать данные из базы данных.
  • Бизнес-уровень получает этот объект из уровня данных.
  • Накладной слой нуждается в этом объекте, но не может ссылаться на уровень данных. Таким образом, бизнес-уровень должен преобразовать объект уровня данных в объект бизнес-уровня, который может получить прикладной уровень.

Просто говорить о том, что делает это звучит как головная боль :)

Вместо этого рассмотрим несколько измененную архитектуру:

  • Общая библиотека содержит DTOs (а также, возможно, интерфейсов и других распространенных типов), но нет значащей логики и ничего не ссылается.
  • Слой прикладного уровня для бизнес-уровня и общей библиотеки.
  • Слой данных уровня бизнес-уровня и общая библиотека.
  • Общая информация об уровне данных.

Теперь, когда объект, возвращаемый уровнем данных, может полностью перейти на прикладной уровень без изменений, так как каждый слой понимает этот тип.

Это не означает, что эта настройка ideal. Во многих случаях я бы даже утверждать, что этот подход «общих DTO» может быстро стать анти-шаблоном и является плохой заменой для надлежащей архитектуры, основанной на домене. Но, я всегда был немного пуристом в таких вещах. Мой аргумент зависит от идеи о том, что бизнес-уровень ничего не ссылается, и слой данных ссылается на бизнес-уровень. Что, если вы не знакомы с шаблонами и методами инверсии зависимостей, будет сложно для вас.

В простых случаях с этой простой трехслойной вертикальной архитектурой наличие общей библиотеки может быть очень удобным, чтобы избежать этой точной проблемы.

+0

Большое вам спасибо за ваши комментарии в моем оригинальном посте и за это разъяснение. Я реализовал то, что вы предложили, и это сработало как шарм. – Kulstad

Смежные вопросы