Transition from Entityspaces(Tiraggo) into Servicestack Ormlite

后端 未结 1 667
深忆病人
深忆病人 2021-01-24 07:17

at this moment we are migrating from Entityspaces(Tiraggo) into Servicestack Ormlite.

One point is the way to open and close the DBConnection.

I apologize for th

1条回答
  •  粉色の甜心
    2021-01-24 08:05

    The nice thing about IDbConnectionFactory is that it's a ThreadSafe Singleton which can be safely passed around and referenced as it doesn't hold any resources open itself (i.e. DB Connections).

    A lazy pattern which provides a nice call-site API is the RepositoryBase class:

    public abstract class RepositoryBase : IDisposable, IRepository
    {
        public virtual IDbConnectionFactory DbFactory { get; set; }
    
        IDbConnection db;
        public virtual IDbConnection Db
        {
            get { return db ?? (db = DbFactory.OpenDbConnection()); }
        }
    
        public virtual void Dispose()
        {
            if (db != null)
                db.Dispose();
        }
    }
    

    This is the same pattern ServiceStack's Service class uses to provide a nice API that only gets opened when it's used in Services, e.g:

    public class MyRepository : RepositoryBase
    {
        public Foo GetFooById(int id)
        {
            return Db.SingleById(id);
        }
    }
    

    Note: This pattern does expect that your dependencies will be disposed after use.

    Another alternative is to leverage your IOC to inject an Open IDbConnection with a managed lifetime scope, e.g:

    container.Register(c => 
        c.Resolve().OpenDbConnection())
        .ReusedWithin(ReuseScope.Request);
    

    The life-cycle of the connection is then up to your preferred IOC.

    Without Using an IOC

    Whilst it's typically good practice to use an IOC to manage your Apps dependencies and provide loose-coupling, if you don't want to use an IOC you can also make DbFactory a static property, e.g:

    public abstract class RepositoryBase : IDisposable
    {
        public static IDbConnectionFactory DbFactory { get; set; }
    
        IDbConnection db;
        public virtual IDbConnection Db
        {
            get { return db ?? (db = DbFactory.OpenDbConnection()); }
        }
    
        public virtual void Dispose()
        {
            if (db != null)
                db.Dispose();
        }
    }
    

    Which you can just initialize directly on startup, e.g:

    protected void Application_Start(object sender, EventArgs e)
    {
        RepositoryBase.DbFactory = new OrmLiteConnectionFactory(
            connectionString, SqlServer.Provider);
    }
    

    Note: If you're not using an IOC then you want to make sure that instances of your repository classes (e.g. MyRepository) are disposed of after use.

    0 讨论(0)
提交回复
热议问题