2012-02-20 2 views
2

Я пытаюсь реорганизовать решение, чтобы вывести на борт другой проект. У меня есть проект Core, где находятся общие классы по проектам.Как мне создать конкретный суперкласс

Я пытался simpify своего вопроса с помощью 2 воображаемых проектов: Праздники и погоды ...

У меня есть настройки процесса загрузки файла для проекта Holidays, который имеет следующие 2 класса:

public class Job 
{ 
    public virtual string CreatedBy { get; set; } 
    public virtual DateTime? CreatedDate { get; set; } 
    public virtual Security Security { get; set; } 

    protected IList<File> _files = new List<File>(); 
    public virtual IEnumerable<File> Files 
    { 
     get { return _files; } 
    } 
} 

public class File 
{ 
    public virtual string FileName { get; set; } 
    public virtual FileType FileType { get; set; } 
    public virtual FileStatusType FileStatusType { get; set; } 
    public virtual Job Job { get; set; } 
} 

Процесс загрузки файлов для проекта Weather имеет ту же структуру, что и Праздники, за исключением того, что класс Jobs не имеет свойства безопасности.

Мой вопрос: возможно ли каким-то образом переместить оба класса в проект Core, чтобы оба проекта могли их использовать? Очевидно, что Погода не нуждается в свойстве безопасности, поэтому я думал, что у меня будет класс Core.Job без обеспечения безопасности, а затем увеличьте Core.Job в Holidays.Job.

Но как только я это делаю в классе Core.File, о чем Иов это относится? Поскольку он сидит в проекте Core, это должен быть Core.Job. Итак, тогда мне нужно, чтобы Job и File сидели в Holidays, а Weather (и любые другие будущие проекты) использовали Core.Job и Core.File?

Я не хочу, чтобы проект Core имел какие-либо ссылки на подпроекты.

Я использую NHibernate, и поэтому имеют файлы сопоставления - добавляя к сложности.

Надеется, что это достаточно ясно

Благодаря

ответ

1

Не очень понятно, почему запутать на soluton предлагаемого Вами (при условии, что я прямо вас понял)

//Core DLL 

public class Job 
{ 
    public virtual string CreatedBy { get; set; } 
    public virtual DateTime? CreatedDate { get; set; } 
    protected IList<File> _files = new List<File>(); 
    public virtual IEnumerable<File> Files 
    { 
     get { return _files; } 
    } 
} 

в Hollidays вас имеют

public class HollidayJob : Job 
{ 
    public virtual Security Security { get; set; } 
} 

in Погода просто используйте тип Job, если он самодостаточен.

В этом случае вы ссылаетесь на CoreDLL от Holliday проекта и Weather. Когда вы сериализуете его через NHibernate, он за HollidayJob сохраняет одно поле больше, но когда Weather читает ту же таблицу, он пропускает это поле, так как ничего не знает и на самом деле не заботится об этом.

Надеюсь, это поможет.

+0

Спасибо Тиграну. Но как бы выглядел класс File? Как и в моем примере кода выше, класс файла имеет свойство Job на нем. Итак, нужен ли мне файл HolidayFile, содержащий HolidayJob? –

2

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

  • само ядро ​​работает ли с базой Job каким-либо образом? Если это не так, реализация Job отдельно в каждом проекте может помочь вам удержать связь, хотя я немного избыточен. В коде, который я написал, я иногда вводил ненужные зависимости, извлекая интерфейсы без добавления истинной выгоды. Вот почему я немного осторожен.
  • В случае, если Core работает с ним, часть для рефакторинга в общую базу Job - это, пожалуй, интерфейс, с которым он работает.
  • Вы можете думать о интерфейсе вместо базового класса. Security могут семантически принадлежать другому интерфейсу. Кроме того, вы передаете большой контроль над вашими классами до Core.
  • Вы когда-нибудь передавали работу из одного проекта другому (или сопоставлялись ли они с одной таблицей DB через NHibernate?)? Если вы этого не сделаете, внутренний избыточный класс тоже может быть прекрасен.
+0

Спасибо Mudu. В ответ на ваши вопросы: Core не работает с базовым заданием. Работа не будет передаваться из одного проекта в другой. Не могли бы вы добавить код, объясняющий излишнюю идею интерфейса, которую вы упомянули выше, пожалуйста? Я следил за шаблоном, описанным Тиграном ниже, поэтому у HolidayJob, а затем в классе File был IJob, который был интерфейсом Core.Job. Однако это привело к следующей ошибке nHibernate: ассоциация из таблицы FL_File относится к классу unmapped: Core.FileLoad.IJob. Спасибо –

+0

Я не выразил слишком четко. Прежде чем я отредактировал первый пункт: «Резервный» означал только две отдельные реализации «Job», ничего необычного. К сожалению, я не очень хорошо знаю NHibernate. –

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