Я работаю на сайте ASP.NET MVC, используя EF4 и Automapper.Я делаю хорошие успехи и чувствую себя довольно хорошо для дизайна (учитывая, что это мой первый удар по настоящей архитектуре DDD).Но я начинаю видеть некоторые вещи, с которыми мне не слишком удобно.
Вопросы, которые у меня есть, вероятно, больше связаны с моим отсутствием опыта работы с Automapper и DDD, поэтому они могут быть довольно простыми для некоторых изВы должны ответить и указать мне в правильном направлении.Есть также очень хороший шанс, что я пойду по этому поводу совершенно неправильно, но мое руководство основано на том, что я читаю здесь, некоторые из поиска, а некоторые задают мои собственные вопросы.Но я также начинаю понимать, что некоторые из «советов», которые я вижу, противоречат друг другу.
Краткий обзор, моя модель предметной области - это просто сгенерированные POCO из шаблона POCO EF4 (анемичные).Они используются на моем сервисном уровне, и они также доступны моему приложению через сервисный уровень.У меня нет никакого DTO, только моя анемичная модель предметной области, модели представления и Automapper для сопоставления этих двух, согласно совету , который мне дали .Это все хорошо и прекрасно, если предположить, что они могут быть сопоставлены один к одному.
Мои проблемы возникают, когда мне приходится сводить модели моего домена в одну модель представления или когда мне требуется некоторая бизнес-логика для определения свойства модели представления.
Два примера:
Сглаживание
У меня есть две модели: User и UserProfile.Это сопоставление один-к-одному, поэтому оно уже логически плоское - оно просто в двух отдельных моделях.Моей модели представления нужны свойства как User, так и UserProfile в одном объекте.Из того, что я видел, у Automapper нет простого способа сделать это, поэтому я расширил свой User POCO, добавив в него необходимые свойства UserProfile:
public string UserName
{
get { return UserProfile.UserName; }
}
Я не большой поклонникэто, как кажется, нарушает СУХОЙ, и может стать чем-то вроде боли, чем больше я должен это делать.
Инкапсуляция бизнес-логики
У меня есть еще один случайгде свойство User не хранится, а выводится и требует некоторой логики перед возвратом значения.Например, URL изображения профиля будет зависеть от того, зарегистрированы ли они в Facebook или Twitter.Итак, у меня есть что-то вроде этого:
public string ProfileImageUrl
{
get
{
if (User.TwitterId != null)
{
// return Twitter profile image URL
}
if (User.FacebookId != null)
{
// return Facebook profile image URL
}
}
}
Я почти уверен, что это не то, за что отвечает Automapper, но я не уверен, следует ли это делать с расширением модели домена, если яхочу сохранить анемию.Так что я не уверен, к чему это относится.
Я не совсем зациклен на том, чтобы моя модель предметной области была анемичной (я знаю, что это ее собственная дискуссия), но я ожидаю, что эта модель предметной области будет использоваться несколькими приложениямис различными моделями представления и проверкой.
Заранее спасибо.
ОБНОВЛЕНИЕ: В ответ на @jfar моя главная проблема с примером выравнивания заключается в том, что это выглядит такдолжно быть что-то, что Automapper должен уметь делать.Если нет, то я могу жить с этим вариантом.Я просто искал кого-то, чтобы дважды проверить мой дизайн, чтобы убедиться, что нет лучшего способа сделать это.
Моя проблема с примером инкапсулирующей бизнес-логики в том, что я нарушаю анемию моегодоменная модель.В некоторых случаях это может даже потребовать попадания в репозитории, чтобы получить определенные данные для бизнес-логики, и это кажется мне плохим дизайном.
Другая вещь, которую я начинаю удивляться, это то, не стоит ли мнеу меня нет слоя DTO, но я, честно говоря, тоже не хочу идти по этому пути (и в связи с вопросом, который я связал выше, кажется более приемлемым не использовать DTO с DDD).