use crate::db_context::{DbContext, DbContextOptions, DbContextOptionsBuilder, IDbContext};
use std::sync::Arc;
pub trait DbContextServiceCollectionExt {
fn add_dbcontext<T, F>(self, configure: F) -> Self
where
T: IDbContext + FromDbContextOptions + 'static,
F: FnOnce(&mut DbContextOptionsBuilder) + Send + Sync + 'static;
fn add_dbcontext_keyed<T, F>(self, key: &str, configure: F) -> Self
where
T: IDbContext + FromDbContextOptions + 'static,
F: FnOnce(&mut DbContextOptionsBuilder) + Send + Sync + 'static;
fn add_dbcontext_from_options<T>(self, options: DbContextOptions) -> Self
where
T: IDbContext + FromDbContextOptions + 'static;
}
impl DbContextServiceCollectionExt for ::lrdi::ServiceCollection {
fn add_dbcontext<T, F>(self, configure: F) -> Self
where
T: IDbContext + FromDbContextOptions + 'static,
F: FnOnce(&mut DbContextOptionsBuilder) + Send + Sync + 'static,
{
let mut builder = DbContextOptionsBuilder::new();
configure(&mut builder);
let options = Arc::new(builder.build());
self.transient(move |_| {
let ctx = T::from_options(&options).expect("Failed to create DbContext");
Arc::new(ctx) as Arc<dyn IDbContext>
})
}
fn add_dbcontext_keyed<T, F>(self, key: &str, configure: F) -> Self
where
T: IDbContext + FromDbContextOptions + 'static,
F: FnOnce(&mut DbContextOptionsBuilder) + Send + Sync + 'static,
{
let mut builder = DbContextOptionsBuilder::new();
configure(&mut builder);
let options = Arc::new(builder.build());
self.keyed_transient(key, move |_| {
let ctx = T::from_options(&options).expect("Failed to create DbContext");
Arc::new(ctx) as Arc<dyn IDbContext>
})
}
fn add_dbcontext_from_options<T>(self, options: DbContextOptions) -> Self
where
T: IDbContext + FromDbContextOptions + 'static,
{
let opts = Arc::new(options);
self.transient(move |_| {
let ctx = T::from_options(&opts).expect("Failed to create DbContext");
Arc::new(ctx) as Arc<dyn IDbContext>
})
}
}
pub trait FromDbContextOptions: IDbContext + Sized {
fn from_options(options: &DbContextOptions) -> crate::error::LrefResult<Self>;
}
impl FromDbContextOptions for DbContext {
fn from_options(options: &DbContextOptions) -> crate::error::LrefResult<Self> {
DbContext::from_options(options)
}
}
pub use lrdi::{ServiceCollection, ServiceProvider};