0

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

Rhino Security - S#arp 架构

我正在使用来自 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();
4

3 回答 3

0

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

于 2010-10-11T13:37:42.370 回答
0

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

于 2010-10-12T08:37:48.270 回答
0

感谢所有提供帮助的人。

最后都是我自己的错。

我需要做的就是更好地遵循S#arp 架构说明

从旧版本的 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())
        {
        }
于 2010-11-03T05:43:32.727 回答