Совместное использование логики домена между похожими классами в моей архитектуре - PullRequest
0 голосов
/ 24 марта 2011

Мое веб-приложение MVC ASP.NET разделено следующим образом:

Web Application Layer
  Views

Domain Layer
  Repository
    [Repository and Interfaces here]
  Domain
    [Domain Classes here]

Это довольно новое и развивающееся, и я начинаю видеть некоторые проблемы с ним.Мои классы домена являются объектами POCO - я использую Linq to SQL «Code First», поэтому я добавляю свои собственные классы и украшаю их для работы с ними в репозитории.Сначала все шло хорошо, я мог добавить бизнес / доменную логику к классам, и это казалось довольно чистым.

Совсем недавно я создал несколько представлений базы данных, которые основаны на одной и той же «базовой» таблице - таблице «Оборудование».Я создаю класс домена POCO для каждого представления, чтобы я мог читать из него в своем хранилище.Проблема, с которой я столкнулся, заключается в том, что логика домена, добавленная к базовому классу домена Equipment, недоступна для моих новых представлений.Я не могу использовать общий базовый класс, так как Linq to SQL не работает с этим, если вы используете атрибуты для украшения ваших классов.Не использовать представления не вариант, потому что они полезны и за пределами веб-приложения.

Есть ли хорошее решение для этого, я задаюсь вопросом, возможно, мне нужно подумать о разделении классов, чтоХранилище работает с отдельным набором «классов доменов», чтобы решить эту проблему?

[Редактировать] Больше информации по запросу.Например, мой класс «Equipment» (который является классом домена, который сопоставлен с базой данных) содержит следующий код:

public string EquipmentDescription
        {
            get
            {
                return String.Format("U{0}{1}{2}",
                                         String.Format("{0}", UPos.ToString("00")),
                                         String.IsNullOrEmpty(EquipmentName) ? "" : ": " + EquipmentName,
                                         String.IsNullOrEmpty(Label) ? "" : " - " + Label
                                         );
            }
        }

Теперь у меня есть представление в базе данных «EquipmentWithCableDetails», котороесодержит дополнительную полезную информацию с деталями оборудования - поэтому я создаю класс для моделирования этого представления (чтобы иметь возможность читать из него).В коде, который работает с этим новым классом, я хочу отобразить описание EquipmentDescription, но это свойство существует только в классе Equipment.

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

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

0 голосов
/ 24 марта 2011

Один шаблон, который вы можете использовать при совместном использовании логики между классами, - это вспомогательный шаблон.

Все ваши классы могут вызывать помощника, если им нужен доступ к доменной логике.

Иногда вспомогательный шаблон считается антиинтерфейсным, но в вашем случае его невозможно поместить в базовый класс.

http://blogs.msdn.com/b/nickmalik/archive/2005/09/06/461404.aspx

...