S#arp架构 - Rhino Security(未映射类:Rhino.Security.IUser)

时间:2010-10-11 03:12:22

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

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

实施了Rhino Security集成

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();

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

感谢所有帮助过的人。

最后这是我自己的错。

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

从旧版本的S#arp我有2个配置文件hibernate.cfg.xml和NHibernate.config。我以为我仍然需要两者,但我需要的只是hibernate.cfg.xml用于S#arp版本1.6并使用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())
        {
        }