我正在尝试理解和找出设计应用程序/领域模型(POCOs / DTOs)的良好实践。
假设我有以下数据库表,Account:
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方法中传入什么参数。视图模型当然位于我的Web应用程序(表示层)下,因此我不想将其传递到我的服务中。
因此,我考虑了以下四种可能性:
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
}
}
这三种情况都不是很理想,因为我在每一种情况下都看到了问题。 所以我想知道是否有其他我没想到的方法。
针对这个问题有什么好的做法吗?
提前感谢。
RegistrationModel
方法将所有内容都抽象化了,但这并不会使你的系统更易于维护(这是过度工程化的信号)。 - Vasiliy RRegistrationService.RegisterUser(Account account, string password)
方法已经足够理想了(是的,重点在于“足够”)。 - Vasiliy R