【问题标题】:Servicestack UserAuth Persistence using Nhibernate (using ServiceStack.Authentication.NHibernate)Servicestack UserAuth Persistence 使用 Nhibernate(使用 ServiceStack.Authentication.NHibernate)
【发布时间】:2014-02-05 08:25:35
【问题描述】:

我正在尝试为 Nhibernate 使用 ServiceStack IUserAuthRepository 实现。 我已经在我的服务 IOC 容器中注册了 NHibernateUserAuthRepository,但我不知道如何告诉 Nhibernate 将 AuthUser 和角色映射到数据库表。

我的映射发生在容器实例化 ISessionFactory(使用 FluentNhibernate)时。

这是 AppHost 代码:

container.Register<ICacheClient>(new MemoryCacheClient());

container.Register<IDatabaseFactory>(c => new Oracle10DatabaseFactory(_DomainAssembly, _DomainAssemblyName,
                                                            c.Resolve<ConfigurationParameters>()));
// Register EventPublisher
        container.RegisterAutoWiredAs<EventPublisher, IEventPublisher>().ReusedWithin(ReuseScope.Request);
        container.RegisterAutoWiredAs<EventPublisherInterceptor, IInterceptor>().ReusedWithin(ReuseScope.Request);

// Register Session & UnitOfWork
container.Register<NHibernate.ISession>(item =>
container.Resolve<IDatabaseFactory>().SessionFactory.OpenSession(new EventPublisherInterceptor(container.Resolve<IEventPublisher>())))
            .ReusedWithin(ReuseScope.Request);

container.Register<IUnitOfWork>(item => new UnitOfWork(container.Resolve<NHibernate.ISession>())).ReusedWithin(ReuseScope.Request);

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
                new IAuthProvider[] { new CredentialsAuthProvider() }));

这是Oracle10DatabaseFactory 构造函数:

public Oracle10DatabaseFactory(Assembly assembly, string namespace, ConfigurationParameters parameters)
{
    var fileCache = new ConfigurationFileCache(assembly, parameters.PathToConfigurationFolder);
    var config = fileCache.LoadConfigurationFromFile();
    if (config == null)
    {                    
        var mapping = AutoMap.Assembly(assembly, new MappingConfiguration(new List<string>() { namespace }))
                    .Conventions.Add<ReferenceIndexConvention>()
                    .Conventions.Add<GuidIndexConvention>()
                    .UseOverridesFromAssemblyOf<MappingConfiguration>();


        this.sessionFactory =
                        Fluently.Configure()
                        .Database(OracleClientConfiguration.Oracle10.ConnectionString(c => c.FromConnectionStringWithKey("ZetesMobility_DataAccess_Connectionstring_Oracle"))
                            .UseReflectionOptimizer())


                        .Mappings(m => m.AutoMappings.Add(mapping)) //.Add(baseMapping)
                        .CurrentSessionContext("web")
                        .ExposeConfiguration(c => c.BuildSchema(NHibernateExtensions.RecreateSchema()))
                        .ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote"))
                        .ExposeConfiguration(fileCache.SaveConfigurationToFile)
                        .BuildSessionFactory();

        config = fileCache.LoadConfigurationFromFile();
        this.sessionFactory = config.BuildSessionFactory();
    }
    else
    {
        this.sessionFactory = config.BuildSessionFactory();
    }
}

如何将身份验证类添加到映射配置?

非常感谢大家。

【问题讨论】:

    标签: nhibernate fluent-nhibernate servicestack


    【解决方案1】:

    在 Fluently.Config() 的 Mappings(m -> m... 部分,您需要告诉 FluentNhibernate 将映射包含在包中,如下所示:

                .Mappings(m =>
                    m.FluentMappings
                        .AddFromAssemblyOf<UserAuthPersistenceDto>())
    

    你的最终应该看起来像

                .Mappings(m =>
                {
                    m.AutoMappings.Add(mapping);
                    m.FluentMappings
                        .AddFromAssemblyOf<UserAuthPersistenceDto>();
                })
    

    【讨论】:

    • 现在我在尝试创建默认用户时遇到 Nhibernate 异常“没有会话绑定到当前上下文”。 userRepository.GetUserAuthByUserName("admin") 失败。
    • 您如何/在哪里打开会话 (ISessionFactory.OpenSession())?
    • 我正在尝试调查它,这很奇怪,因为 GitHub 中的代码与 nuget 包附带的 Api 不同。公共 NHibernateUserAuthRepository 构造函数采用“ISessionFactory”,但 GitHub 中的代码是公共 NHibernateUserAuthRepository(INHibernateSessionProvider sessionProvider)。我很难理解问题出在哪里。
    • 我认为你的类应该调用 ISessionFactory.OpenSession() 因为它需要构造函数中的 dfactory
    • Github 中的代码是相当新的,据我所知尚未部署为 Nugets(我不确定是否/何时会发生)。您的代码: container.Resolve().SessionFactory.OpenSession(new EventPublisherInterceptor(container.Resolve()))) .ReusedWithin(ReuseScope.Request); ISession 何时打开? UserAuthRepository 要求在使用之前由其他人打开会话。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2012-07-07
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多