我有一个向业务层发送命令的分层应用程序(实际上,该应用程序是基于ncqrs 框架的,但我认为这里并不重要)。
命令如下所示:
public class RegisterUserCommand : CommandBase
{
public string UserName { get; set; }
public string Email{ get; set; }
public DateTime RegistrationDate { get; set; }
public string ApiKey {get; set;} // edit
}
这个类没有逻辑,只有数据。
我想让用户输入他们的用户名、电子邮件,并且我希望系统使用当前日期来构建命令。
什么是最好的:
创建基于 RegisterUserCommand 的强类型视图,然后在将其发送到业务层之前注入日期和 APi 密钥?
创建一个RegisterUserViewModel类,用这个类创建视图并根据视图输入创建命令对象?
我编写了以下代码(用于解决方案 n°2):
public class RegisterController : Controller
{
//
// GET: /Register/
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(RegisterUserViewModel registrationData)
{
var service = NcqrsEnvironment.Get<ICommandService>();
service.Execute(
new RegisterUserCommand
{
RegistrationDate = DateTime.UtcNow,
Email= registrationData.Email,
UserName= registrationData.Name,
ApiKey = "KeyFromConfigSpecificToCaller" // edit
}
);
return View();
}
public class RegisterUserViewModel
{
[Required]
[StringLength(16)]
public string Name { get; set; }
[Required]
[StringLength(64)]
public string Email{ get; set; }
}
}
这段代码正在工作......但我想知道我是否选择了正确的方式......
感谢您的建议
[编辑]由于日期时间似乎引起误解,我添加了另一个属性“ApiKey”,它也应该设置在服务器端,从 web 层(而不是从命令层)
[编辑 2]尝试 Erik 的建议并实施我想象的第一个解决方案:
[HttpPost]
public ActionResult Index(RegisterUserCommand registrationCommand)
{
var service = NcqrsEnvironment.Get<ICommandService>();
registrationCommand.RegistrationDate = DateTime.UtcNow;
registrationCommand.ApiKey = "KeyFromConfigSpecificToCaller";
service.Execute(
registrationCommand
);
return View();
}
...可以接受吗?