Как мне разработать конкретный суперкласс - PullRequest
2 голосов
/ 20 февраля 2012

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

Я попытался упростить свой вопрос, используя 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 имеет ту же структуру, что и Holidays, за исключением того, что класс Jobs не имеет свойства Security.

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

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

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

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Конечно, вы можете сделать это, но я не уверен, приносит ли это вам истинную пользу:

  • Работает ли само Ядро с базой Job каким-либо образом? Если этого не произойдет, реализация Job отдельно в каждом проекте может помочь вам сохранить связь, даже если бы я был немного излишним. В коде, который я написал, я иногда вводил ненужные зависимости, извлекая интерфейсы, не добавляя истинных преимуществ. Вот почему я немного осторожен.
  • В случае, если Core выполняет с ним точную работу, часть, которую необходимо преобразовать в общую базу Job, возможно, является интерфейсом, с которым он работает.
  • Вы можете подумать об интерфейсе вместо базового класса. Security может семантически принадлежать другому интерфейсу. Более того, вы передаете большой контроль над своими классами Core.
  • Вы когда-нибудь передавали работу из одного проекта в другой (или они сопоставляются с одной и той же таблицей БД через NHibernate?)? Если вы этого не сделаете, внутренний избыточный класс тоже может подойти.
1 голос
/ 20 февраля 2012

Не очень понятно, зачем путать предложенный вами солутон (при условии, что я вас правильно понял)

//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; }
    }
}

в Праздники у вас

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...