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;
}
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>
})
}
}
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};