Я пытаюсь понять и нарисовать примеры для разработки моделей приложений/доменов (POCOs/DTOs).
Скажем, у меня есть следующая таблица базы данных, Учетная запись:
UserID int
Email varchar(50)
PasswordHash varchar(250)
PasswordSalt varchar(250)
Конечно, EF4 построил бы сущность так:
public class Account
{
public int UserID { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
public string PasswordSalt { get; set; }
}
Теперь скажем, у меня есть модель просмотра для регистрации нового пользователя, которая может выглядеть примерно так:
public class RegistrationViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
Наконец, у меня есть служба, которая должна регистрировать пользователя:
public class RegistrationService
{
public void RegisterUser(??? registration)
{
// Do stuff to register user
}
}
Я пытаюсь понять, что нужно передать в метод RegisterUser. Разумеется, модель просмотра находится под моим веб-приложением (уровень представления), поэтому я не хочу, чтобы это передавалось моей службе.
Итак, я думаю о одной из четырех возможностей:
1) Настройте модель сервиса, которая аналогична, если не идентична, для параметра RegistrationViewModel и используйте это:
public class RegistrationServiceModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RegistrationService
{
public void RegisterUser(RegistrationServiceModel registration)
{
// Do stuff to register user
}
}
2) Настройте интерфейс модели и наследуйте ее в моей модели представления и настройте мой метод для приема интерфейса:
public interface IRegistrationModel
{
string Email;
string Password;
}
public class RegistrationServiceModel : IRegistrationModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RegistrationService
{
public void RegisterUser(IRegistrationModel registration)
{
// Do stuff to register user
}
}
3) Перейдите в объект Account, выполнив сопоставление RegistrationViewModel-to-Account в моем контроллере:
public class RegistrationService
{
public void RegisterUser(Account account)
{
// Do stuff to register user
}
}
4) Переместите мою модель представления из презентации в уровень домена/службы и передайте ее в метод службы:
public class RegistrationService
{
public void RegisterUser(RegistrationViewModel account)
{
// Do stuff to register user
}
}
Ни один из этих трех сценариев не кажется идеальным, поскольку я вижу проблемы в каждом из них. Поэтому мне интересно, есть ли другой способ, о котором я не могу думать.
Каковы хорошие практики для этого?
Спасибо заранее.