使用数据库调用填充ServiceStack会话是否很困难?

时间:2013-09-07 13:43:59

标签: c# session servicestack ormlite-servicestack

我想在我的自定义AuthUserSession中使用Ormlite进行整洁的数据库调用(顺便说一句,它与AppHost项目位于一个单独的项目中)。但我似乎只能得到原始数据库连接对象。

public class CustomUserSession : AuthUserSession
{
    public string CustomProperty { get; set; }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

         // using (var Db = authService.TryResolve<ServiceStack.OrmLite.OrmLiteConnectionFactory>().OpenDbConnection())
        using (var Db = authService.TryResolve<ServiceStack.OrmLite.IDbConnectionFactory>().OpenDbConnection())
        {
            // it seems I can make long winded calls to database using 'Db'  but
            // instead I want to eliminate this 'using statement' and simply do

            // var result = Db.FirstOrDefault<MyTable>(x => x.Id == userId);
            // CustomProperty = result.aStringField;
        }
    }
}

[旁注:文档经常说我们需要执行以下操作才能将数据附加到会话中,但我的会话对象似乎没有它就可以工作,即在派生的'Service'类中公开数据...我错过了某个地方的点?:]

//Important: You need to save the session!
authService.SaveSession(session, SessionExpiry);

//更新 *

我的AppHost有这个:

var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register<IUserAuthRepository>(c => new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));

var authRepo = (OrmLiteAuthRepository)container.Resolve<IUserAuthRepository>();

Gavin的答案非常有用,但仍然无法给出提供Ormlite方法的'Db'对象。

我尝试创建

protected ServiceStack.OrmLite.IDbConnectionFactory Db1 { get; set; }

并使用以下行在CustomUserSession()构造函数中连接它:

this.Db1 = EndpointHost.AppHost.TryResolve<ServiceStack.OrmLite.IDbConnectionFactory>();

但它没有按预期工作。

1 个答案:

答案 0 :(得分:1)

根据您的意愿解析数据库类/ factory / repository(假设您已将其注册到IOC容器中)。

public class CustomUserSession : AuthUserSession
{

    public CustomUserSession()
    {
        this.Log = LogManager.GetLogger(this.GetType());
        this.Repository = EndpointHost.AppHost.TryResolve<IRepository>();
    }

    protected IRepository Repository { get; set; }
    protected ILog Log { get; set; }

    public string CustomProperty { get; set; }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo)
    {

        this.CustomProperty = this.Repository.GetCustomProperty(session.UserAuthName);

        var otherRepository = authService.TryResolve<IOtherRepository>();
        session.Permissions.AddRange(otherRepository.GetPermissions(session.UserAuthId));

        // etc.....

        base.OnAuthenticated(authService, session, tokens, authInfo);

    }

    public override void OnRegistered(IServiceBase registrationService)
    {
        this.Log.WarnFormat(
            "OnRegistered - queue a registered event/email/notification");

        base.OnRegistered(registrationService);
    }

}

就调用SaveSession而言,IIRC需要保留更改,但这是在实施AuthProvider时。