【问题标题】:Repository pattern connection string存储库模式连接字符串
【发布时间】:2015-08-22 14:29:38
【问题描述】:

我正在为 WinForms 有点像这样的小应用程序构建一个通用存储库:

public interface IRepository<T> where T : class
{
    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Expression<Func<T, bool>> query);
    T GetByID(int id);
    void Add(T item);
    void Update(T item);
    void Delete(T item);
}

我知道很多人不建议使用存储库模式,但在这种情况下可以节省大量代码,因为所有 POCO 都将非常相似并使用接口中声明的所有方法。

这将使用 ServiceStack.OrmLite 实现。

我不想使用ConfigurationManager 来获取连接字符串。什么是实现这一目标的好方法?我考虑过使用BaseRepository 类来初始化静态连接字符串,但我不确定如何实现。

有什么建议吗?

【问题讨论】:

  • 为什么不想使用 ConfigurationManager 来管理连接字符串?
  • 通常连接字符串由ConfigurationManager 管理并注入Session 类。会话实例被进一步注入存储库,因此当您查询数据库时,它就像repo -&gt; session -&gt; execute query
  • @DavidKemp 由于其他原因,我不允许发送 App.config 文件。
  • @HMihail - 我很好奇为什么你不能发布 app.config,但是还有其他设置可以确定应用程序的行为

标签: c# repository-pattern ormlite-servicestack


【解决方案1】:

BaseRepository 类将是一个抽象类,它抽象地实现了 IRepostiory 中的方法:

public class BaseRepository<T> : IRespository<T> where T : class
{
    protected readonly string ConnectionString = "your connection string here"; /*could event be static?*/

    public abstract IEnumberable<T> GetAll();
    /*....*/
}

我没有使用过 OrmLite,但看起来您可能可以实现 BaseRepository 类中的大部分方法。任何体面的 DI 容器都可以使用它,而不必为每个实体拥有一个单独的存储库类。

但是,由于存储库模式通常与工作单元模式一起使用,您可能需要考虑这一切是如何通信的。

最后一点:我会警告 GetAllIEnumerable - 除了查找表可能只会有少量行。一旦您开始拥有任何数量的数据,您就需要分块检索它 - 一次加载数十万(或更多?)记录将非常缓慢。

【讨论】:

  • 混合配置和代码是个坏主意。您不想在每次配置更改时重新编译应用程序。
  • @oleksii - 因此我的问题是关于为什么 OP 不想使用 ConfigurationManager
  • @DavidKemp - 我在应用程序启动时从机器上的 .ini 文件中读取了连接字符串。我正在考虑在应用程序启动时使用一些 Init() 方法在 BaseRepository 中进行初始化,但我不确定这是否是一个好方法?
  • @DavidKemp - 关于GetAll,我知道这一点,对于将保存许多记录的实体,我将在他们的Repository 实现中实现分页或类似的东西。
  • @HMihail - 是的,这可以工作 - 如果您使用的是 DI/IoC 容器,您可以在设置中将其全部连接起来。
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
相关资源
最近更新 更多