ServiceStack + ORMLite +存储库模式

Cal*_*ass 7 design-patterns repository-pattern servicestack ormlite-servicestack

我正在尝试使用ORMLite实现Repository模式.我最初开始时:

public List<Todo> GetByIds(long[] ids)
{
    using (IDbConnection dbConn = dbFactory.OpenDbConnection())
    {
        return dbConn.Ids<Todo>(ids).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在我的存储库中的每个方法下都有这个似乎有点重复?所以我创建了一个数据上下文类,我的所有存储库都继承自:

public class TodoRepository : DataContext
Run Code Online (Sandbox Code Playgroud)

这是DataContext班级:

public class DataContext
{
    protected OrmLiteConnectionFactory dbFactory = new 
OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["AppDb"].
ConnectionString, SqlServerOrmLiteDialectProvider.Instance);

    protected IDbConnection dbConn;

    public DataContext()
    {
        dbConn = dbFactory.OpenDbConnection();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我只需要在我的方法中执行此操作:

public List<Todo> GetByIds(long[] ids)
{
    return dbConn.Ids<Todo>(ids).ToList();
}
Run Code Online (Sandbox Code Playgroud)

我很好奇这是一个很好的设计模式,以及在使用Repository模式进行ORMLite数据访问时还有其他的设计模式.

myt*_*thz 8

我不会对存储库中的连接强类型DialectProvider和配置进行硬编码.相反,我会做一些类似于ServiceStack的基本服务类的事情,例如:

public class Repository : IDisposable {

    public IDbConnectionFactory DbFactory { get; set; } //injected by IOC

    IDbConnection db;
    IDbConnection Db 
    { 
        get 
        {
            return db ?? db = DbFactory.Open();
        }
    }

    public List<Todo> GetByIds(long[] ids)
    {
        return Db.Ids<Todo>(ids);
    }

    public void Dispose() {
        if (db != null)
            db.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以初始化IDbConnectionFactory它的位置,即在您的Host项目的IOC注册中.在ServiceStack中,这是AppHost.Configure():

container.Register<IDbConnectionFactory>(c => 
    OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["AppDb"].
        ConnectionString, SqlServerDialect.Provider);

container.RegisterAutoWired<Repository>().ReusedWithin(ReuseScope.None); 
Run Code Online (Sandbox Code Playgroud)

  • @ robertmiles3注意`DbFactory`注册依赖已经是单例.单例存储库还需要确保线程安全,并且需要从每个API调用后面的DbFactory解析IDbConnection,使得impl更加冗长,并且需要从池中获取每个Db访问,这比从IOC获取更昂贵.基本上除非有一个很好的理由我会避免使用单例存储库,你可以将DbFactory作为单例提供,但你实际上只是保存一个字典访问权限,所以IMO不值得. (3认同)