将方法添加到实体模型的最佳方法是什么。
这样,我有一个User
模型,我想在类中添加一个哈希密码的方法。
我尝试制作一个UserHelper
类,扩展User
,但这似乎会适得其反。
答案 0 :(得分:3)
如果EF类不是部分类,则可以修改T4模板以使其成为部分类。
partial class是一个跨多个文件定义的类。在编译时,编译器从所有文件构建类定义。部分类最常用于将代码添加到通过自动化工具生成的类中(并且通常在每次生成运行时都会被销毁),例如EF的T4模板。
如上所述,对于部分类,您可以在单独的文件中将方法添加到您尝试“扩展”的类中。
说完所有这些之后,您也可以考虑extension methods。
扩展方法是一种简洁的语法/编译器技巧,可以扩展您不能使用的类型的功能(例如,您不拥有代码或不能将它们子类化)修改。通过编写扩展方法,您基本上编写了一个静态方法,该方法将被调用,就像它是您刚刚扩展的类型的实例方法一样。
我认为任何一个选项几乎都一样好,但我倾向于使用部分类方法。
答案 1 :(得分:3)
虽然部分类和扩展方法肯定可以满足您的目的,但我认为在这种特定情况下,您最好将密码散列的责任移交给某种身份验证服务,而不是让您的模型实现该逻辑。然后,该服务将使用用户名和密码(以纯文本形式,尚未散列)作为输入,并在成功的身份验证尝试时返回IPrincipal
,否则返回其他内容(抛出异常,返回null,等等)你想表明认证尝试失败了。)
简化,我会这样称呼服务:
IPrincipal user = _authService.Authenticate(username, password);
if (user == null)
{
ShowErrorMessage("No such user!");
}
else
{
ShowStatusMessage("Login successful!");
}
此服务还将处理创建新用户,删除用户等 - 可能通过使用EF的存储库联系数据库。 (在这种情况下,您的EF模型需要一个属性来存储散列密码,但散列本身不会在模型中发生 - 它由服务完成。)