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数据访问时还有其他的设计模式.
我不会对存储库中的连接强类型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)