Архитектура S#arp — Rhino Security (несопоставленный класс: Rhino.Security.IUser)

Я использую S#arp Architecture 1.6 и реализовал интеграцию Rhino Security в соответствии с

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

is

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

person RichG    schedule 11.10.2010    source источник
comment
Вы должны позвонить Security.Configure<User> после ConfigureNHibernate, но до BuildSessionFactory. Для этого вам придется внести небольшое изменение в исходный файл S#arpArch NHibernateSession.   -  person David Perlman    schedule 14.10.2010


Ответы (3)


Вам нужно сопоставление NHibernate для вашего класса User (т. е. класса, который реализует интерфейс IUser). Вам также нужна таблица в базе данных с правильными полями для вашего класса User.

person Dan    schedule 11.10.2010
comment
Спасибо, Дэн, у меня есть пользовательский класс, сопоставленный в user.hbm.xml, и пользовательский класс, реализующий IUser, все они также правильно сопоставлены с полями базы данных. - person RichG; 12.10.2010
comment
Разве вы не должны отображать интерфейс IUser? Это было сказано об ошибке. Простое предположение никогда не работало с Rhino, но обычно эта ошибка связана с тем, что класс/интерфейс неправильно отображаются. - person Homer1980ar; 14.10.2010

Вы должны позволить RS выполнить некоторую работу по настройке, прежде чем SessionFactory будет создан. Посмотрите на второй выпуск здесь http://groups.google.com/group/sharp-architecture/browse_frm/thread/4093c52596f54d23/194f19cd08c8fdd7?q=#194f19cd08c8fdd7. Это должно привести вас в правильном направлении.

person David Perlman    schedule 12.10.2010

Спасибо всем, кто помог.

В конце концов, это была моя вина.

Все, что мне нужно было сделать, это следовать Инструкциям по архитектуре S#arp. немного лучше.

Из старой версии S#arp у меня было 2 конфигурационных файла hibernate.cfg.xml и NHibernate.config. Я думал, что мне по-прежнему нужны оба, но все, что мне было нужно, это hibernate.cfg.xml для S#arp версии 1.6 и сопоставление User.cs с помощью Fluent NHibernate.

Другие изменения, которые я сделал, были в 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())
        {
        }
person RichG    schedule 03.11.2010
comment
В каком nsamespace я могу найти класс IoC, который вы использовали в IoC.Resolve‹›() - person K.A.D.; 07.01.2011
comment
Здравствуйте! Предоставленная вами ссылка wiki.sharparchitecture.net/RhinoSecurity.ashx больше не указывает на Rhino.Инструкции по безопасности. Знаете ли вы другой источник этих инструкций? Спасибо - person Forer; 24.08.2011