【问题标题】:S#arp Architecture - Rhino Security (unmapped class: Rhino.Security.IUser)S#arp 架构 - Rhino 安全性(未映射的类:Rhino.Security.IUser)
【发布时间】:2010-10-11 03:12:21
【问题描述】:

我正在使用 S#arp Architecture 1.6 并按照

实现了 Rhino 安全集成

Rhino Security - S#arp Architecture

我正在使用来自 Rhino.Commons 的最新版本

我的 Application_EndRequest 方法包含

ISession session = NHibernateSession.Current;

我的 ComponentRegister.cs 包含

        container.Kernel.Register(

            Component.For<IAuthorizationService>()
                .ImplementedBy<AuthorizationService>()
                .LifeStyle.Is(LifestyleType.Transient),
            Component.For<IAuthorizationRepository>()
                .ImplementedBy<AuthorizationRepository>()
                .LifeStyle.Is(LifestyleType.Transient),
            Component.For<IPermissionsBuilderService>()
                .ImplementedBy<PermissionsBuilderService>()
                .LifeStyle.Is(LifestyleType.Transient),
            Component.For<IPermissionsService>()
                .ImplementedBy<PermissionsService>()
                .LifeStyle.Is(LifestyleType.Transient),
            Component.For<IUnitOfWorkFactory>()
                .ImplementedBy<NHibernateUnitOfWorkFactory>()
                .LifeStyle.Is(LifestyleType.Singleton),
            Component.For<Rhino.Commons.IRepository<User>>()
                .ImplementedBy<NHRepository<User>>()
                .LifeStyle.Is(LifestyleType.Transient)
            );


        container.AddFacility<FactorySupportFacility>()
            .Register(Component.For<ISession>()
            .UsingFactoryMethod(() => NHibernateSession.Current)
            .LifeStyle.Is(LifestyleType.Transient)); 

我还按照说明添加了 RhinoSecurityPersistenceConfigurer()。

我打电话时收到的错误

UnitOfWork.Start() 

An association from the table Permissions refers to an unmapped class: Rhino.Security.IUser

有谁知道这个错误的原因可能是什么?

有没有人成功地将 Rhino.Security 与 S#arp 架构集成?

任何帮助都会很棒。

谢谢

丰富

-- 其他细节 --

感谢到目前为止的所有回复。

我仍然无法解决这个问题,所以我想添加更多细节。

在我的 Global.asax.cs 我有

private void InitializeNHibernateSession()
{
  NHibernateSession.Init(
    webSessionStorage,
    new string[] { Server.MapPath("~/bin/SwitchSnapshot.Data.dll") },
    new AutoPersistenceModelGenerator().Generate(),
    Server.MapPath("~/NHibernate.config"),
    null, null, new RhinoSecurityPersistenceConfigurer());
 }

RhinoSecurityPersistenceConfigurer :

public Configuration ConfigureProperties(Configuration nhibernateConfig)
{
  Security.Configure<User>(nhibernateConfig, SecurityTableStructure.Prefix);
  return nhibernateConfig;
}

我有一个 AuthorizationAttribute 调用

using (UnitOfWork.Start())

错误发生在 NHibernateUnitOfWorkFactory.cs 中

sessionFactory = cfg.BuildSessionFactory();

【问题讨论】:

  • 您必须在ConfigureNHibernate 之后但在BuildSessionFactory 之前调用Security.Configure&lt;User&gt;。您必须对 S#arpArch 的 NHibernateSession 源文件进行一些小改动才能做到这一点。

标签: nhibernate s#arp-architecture rhino-security


【解决方案1】:

您的 User 类(即实现 IUser 接口的类)需要一个 NHibernate 映射。您还需要数据库中的表,其中包含您的 User 类的正确字段。

【讨论】:

  • 谢谢 Dan,我在 user.hbm.xml 中映射了用户类和实现 IUser 的用户类,它们也都正确映射到了数据库字段。
  • 不应该映射 IUser 界面吗?这就是说的错误。只是猜测从未与 Rhino 一起工作,但该错误通常是类/接口未正确映射
【解决方案2】:

您必须让 RS 在创建 SessionFactory 之前进行一些配置工作。看这里http://groups.google.com/group/sharp-architecture/browse_frm/thread/4093c52596f54d23/194f19cd08c8fdd7?q=#194f19cd08c8fdd7的第二个问题。它应该能让你朝着正确的方向前进。

【讨论】:

    【解决方案3】:

    感谢所有提供帮助的人。

    最后都是我自己的错。

    我需要做的就是更好地关注S#arp Architecture Instructions

    从旧版本的 S#arp 我有 2 个配置文件 hibernate.cfg.xml 和 NHibernate.config。我认为我仍然需要两者,但我需要的只是 S#arp 1.6 版的 hibernate.cfg.xml 和使用 Fluent NHibernate 映射的 User.cs。

    我所做的其他更改是在 ComponentRegister.cs 中

            container.Kernel.Register( 
                Component.For<IAuthorizationService>()
                    .ImplementedBy<AuthorizationService>()
                    .LifeStyle.Is(LifestyleType.Transient),
                Component.For<IAuthorizationRepository>()
                    .ImplementedBy<AuthorizationRepository>()
                    .LifeStyle.Is(LifestyleType.Transient),
                Component.For<IPermissionsBuilderService>()
                    .ImplementedBy<PermissionsBuilderService>()
                    .LifeStyle.Is(LifestyleType.Transient),
                Component.For<IPermissionsService>()
                    .ImplementedBy<PermissionsService>()
                    .LifeStyle.Is(LifestyleType.Transient),
                Component.For<IUnitOfWorkFactory>()
                    .ImplementedBy<NHibernateUnitOfWorkFactory>()
                    .LifeStyle.Is(LifestyleType.Singleton),
                Component.For<Rhino.Commons.IRepository<User>>()
                    .ImplementedBy<NHRepository<User>>()
                    .LifeStyle.Is(LifestyleType.Transient)
            );
    
            container.Kernel.AddFacility<FactorySupportFacility>()
                .Register(Component.For<ISession>()
                .UsingFactoryMethod(() => NHibernateSession.Current)
                .LifeStyle.Is(LifestyleType.Transient)
            ); 
    

    然后在我的代码中使用以下内容。

            var authorizationService = IoC.Resolve<IAuthorizationService>();
    
            using (UnitOfWork.Start())
            {
            }
    

    【讨论】:

    • 在什么nsamespace我可以找到你在IoC.Resolve中使用过的类IoC()
    • 您好,您在上面提供的链接wiki.sharparchitecture.net/RhinoSecurity.ashx 不再指向Rhino.Security 说明。您知道这些说明的另一个来源吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多