カスタム AuthUserSession (ちなみに、これは AppHost プロジェクトとは別のプロジェクトにあります) 内で Ormlite を使用して適切なデータベース呼び出しを行いたいと考えています。しかし、生のデータベース接続オブジェクトしか取得できないようです。
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;
}
}
}
[補足: ドキュメントでは、セッションにデータを追加するには次のことを行う必要があるとよく言われますが、私のセッション オブジェクトは、それがなくても機能しているように見えます。つまり、派生した「サービス」クラスでデータを公開しています...どこかでポイントを見逃していませんか?:]
//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>();
しかし、それは望みどおりに機能しませんでした。