【问题标题】:NHibernate protected internal vs internalNHibernate 保护内部与内部
【发布时间】:2011-11-17 19:54:51
【问题描述】:

我需要以这样一个事实作为开头,即在谈到 nhibernate 时我是一个完全的新手,而且我不知道我不知道什么。

我有一个这样的用户类:

public class nhMembershipUser : MembershipUser
{
    public new virtual Guid ProviderUserKey { get; set; }
    public new virtual DateTime LastPasswordChangedDate { get; set; }
    public virtual bool IsEnabled { get; set; }
    protected internal virtual byte[] Password { get; set; }
    protected internal virtual string Salt { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Application { get; set; }
    public new virtual string UserName { get; set; }
    public override bool IsOnline
    {
        get
        {
            var UnitOfWork = new nhUnitOfWork();
            return UnitOfWork.UserIsOnline(this);
        }
    }
    public new virtual bool IsLockedOut { get; set; }
    public virtual IList<nhRole> Roles { get; set; }

}

... 以及像这样的流畅映射类:

public class nhMembershipUserMap : ClassMap<nhMembershipUser>
{
    public nhMembershipUserMap()
    {
        Table("Users");
        Id(x => x.ProviderUserKey).Column("UserID");
        Map(x => x.Comment).Nullable().Length(10000);
        Map(x => x.CreationDate).CustomType<UtcDateTimeType>().Not.Nullable();
        Map(x => x.Email).Not.Nullable().Length(250);
        Map(x => x.IsApproved).Default("1");
        Map(x => x.IsLockedOut).Default("0");
        Map(x => x.LastActivityDate).Nullable();
        Map(x => x.LastLockoutDate).Nullable();
        Map(x => x.LastLoginDate).Nullable();
        Map(x => x.LastPasswordChangedDate).Nullable();
        Map(x => x.PasswordQuestion).Nullable().Length(250);
        Map(x => x.ProviderName).Default("").Not.Nullable().Length(250);
        Map(x => x.UserName).Not.Nullable().Length(250);
        Map(x => x.IsEnabled).Default("1").Not.Nullable();
        Map(Reveal.Member<nhMembershipUser>("Password")).Length(260).Nullable();
        Map(Reveal.Member<nhMembershipUser>("Salt")).Length(250).Nullable();
        Map(x => x.FirstName).Length(35).Not.Nullable();
        Map(x => x.LastName).Length(35).Not.Nullable();
        Map(x => x.Application).Length(250).Not.Nullable();
        HasManyToMany(x => x.Roles).ChildKeyColumn("RoleId").ParentKeyColumn("UserId").Cascade.All().Table("UsersToRoles");

    }
}

这可以构建,但是我当然不能在类之外获取或设置 Salt 或 Password 属性,这是伪造的。我试图保持我的用户类轻量级和 POCO-ish,并将加盐和散列功能构建到我的会员提供程序中;我真的不希望公众可以访问,但我希望我的提供者类可以。显而易见的答案是使用内部访问修饰符,但是当我在没有受保护的修饰符的情况下这样做时,NH 会对我大吼大叫,这违背了目的。

如何让我的程序集中的另一个类访问这些受限属性并保存到 NHibernate?看起来这应该很容易做到。

【问题讨论】:

  • 您是哪个大会的“会员提供者”?和 nhMembershipUser 一样吗?
  • 是的。相同的组件,但 NH 的受保护修饰符要求严重限制了我的风格。

标签: nhibernate fluent-nhibernate


【解决方案1】:
public class nhMembershipUser : MembershipUser
{
    private byte[] PasswordHash;
    private string Salt;

    public void SetPassword(ICredentialsProvider provider)
    {
        PasswordHash = provider.GetHash(this);
        Salt = provider.GetSalt(this);
    }
}

【讨论】:

  • 这可以被 nhibernate 访问吗?
  • 实际上,这并不适合我正在尝试做的事情。首先,它肯定会让我的课程大大减少 POCO-ish,其次,这意味着我必须将所有机制放在用户对象中......这很糟糕。
  • 如果你不喜欢它,我会怎么做。尽管如此,您的意思是更少的 DTO-ish(仅数据),因为它仍然与持久性和计算哈希的机制无关。而且您的 IsOnline 也与 POCO 相矛盾
  • 字段设置器而不是公共属性设置器是解决方法,但我最后一次回答时被击落,所以我只会评论;)
  • @Firo 抱歉并不是要批评...并不是说您的代码不好,只是我的选择。你对 IsOnline 的事情是完全正确的,但我试图覆盖它的默认行为(来自MembershipUser 类)所以我在那里没有太多选择......看起来我有一些选择似乎不存在。
猜你喜欢
  • 2022-11-23
  • 2012-03-27
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2010-11-07
  • 2011-03-11
相关资源
最近更新 更多