我正在寻找在ASP.Net MVC3中创建一个自定义成员资格提供程序,我正在努力看到它们如何融合在一起......
我真的在寻找一些如何做到这一点的最佳实践方法。
我有一个User模型(重新发布数据库中的Users表)。为了将此功能与MembershipProvider功能一起使用,此模型是否应继承MembershipUser?在MembershipUser中有许多我不关心的字段 - 这些方法必须在底层的SQL表中才能使用这种方法(显然这似乎是多余的,因为我永远不会使用这些列?)
例如 - 我应该让我的模型像这样继承MembershipUser吗?
/// <summary>
/// Class representing a registered user based on the Users database table.
/// </summary>
public class User : MembershipUser
{
public int Id { get; set; }
//here I can access some other properties I will use which are already in MembershipUser...
//Addtional properties I need specific to my app.
public bool NotifyOfNewBlog { get; set; }
public bool NotifyOfNewWallPosts { get; set; }
//...plus many more.
}
当涉及到使用Membership.GetUser()
时,我是否每次都将该对象强制转换回原始User
对象以便能够访问其他属性?
这是我应该采取的方法吗?或者我是一个单独的User
模型,然后是一个链接回数据库模型的CustomMembershipUser
模型?
如果没有将所有MembershipUser列作为表中的对象,EF是否能够保存/更新/插入用户模型?这甚至接近正确的方法吗?正如你所看到的,我在这里摸不着头脑。
非常感谢任何建议/想法/想法。
答案 0 :(得分:1)
就继承MembershipUser对象而言,可以这样做,并且在您的MembershipProvider实现中,只是转换为派生类型,但我个人不会这样做,仅仅因为你然后由这种类型的未来更改打破你的派生类型(虽然这可以说我可以说大部分框架)。我会把这些额外的值放到一个配置文件中,然后滚动你自己的ProfileProvider,(不要使用Sql,这是我的经验中的垃圾)。
“MembershipUser中有许多字段我并不关心 - 这些方法必须在底层的SQL表中才能使用这种方法(显然这似乎是多余的,因为我永远不会使用这些列?) “
如果你自己滚动,你可以不在Db中保存。毕竟,您正在实现MembershipProvider方法(GetUser等等),因此您对传递给您的MembershipUser对象所做的工作取决于您。您可以忽略这些,而不是验证或存储它们。
答案 1 :(得分:1)
前一段时间我遇到了相同的问题,最后我决定不用会员逻辑污染我的EF模型。我的应用程序中有我的数据访问层,而我的EFMembershipProvider在他必须保存/更新数据时使用它。如果我必须在我的应用程序中 GET 用户数据(除了会员资格本身),我不使用会员资格(我不需要投出任何内容)。
我想说清楚,如果您实施自己的会员提供者
public class EFMembershipProvider : MembershipProvider
您可以抽象成员资格设施的基础功能,以使用您自己的模型/存储库。
您可以在MVC3样板中找到EF实施的成员资格提供程序的示例
https://github.com/crdeutsch/MVC3-Boilerplate
在Web / Infrastructure下(尽管您可能想要修改它的大部分内容)。