我想在我的自定义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>();
但它没有按预期工作。
答案 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时。