2

我正在尝试更好地遵守单一职责原则,并且在掌握如何构建通用类设计以与数据库进行通信时遇到问题。在简化版本中,我基本上有一个数据库,其中包含:

制造商 <== 探针 <==> 探针设置

探头有制造商。一个探头有一组设置。相关对象在整个应用程序中都可以访问,坦率地说,当前的实现是一团糟。

目前,这里是如何实现通信和对象的一般视图:

public class Manufacturer
{
  public int ID; // Primary key, auto-incrementing on insert
  public string Name;
}

public class Probe
{
  public int ID; // Primary key, auto-incrementing on insert
  public int ManufacturerID;
  public string Name;
  public int Elements;
}

public class ProbeSettings
{
  public int ProbeID; // Primary key, since it is unique.
  public int RandomSetting;
}

// This class is a mess...
public static class Database
{
  public static string ConnectionString;

  public static void InsertManufacturer(Manufacturer manuf); // ID would be ignored here, since it's auto-incrementing.
  public static void InsertProbe(Probe probe); // Again, ID generally ignored.
  public static void InsertProbeSettings(ProbeSettings probeSet);

  public static Manufacturer[] GetAllManufacturer();
  public static Probe[] GetProbesFromManufacturer(int manufacturerID);
  public static Probe[] GetProbesFromManufacturer(Manufacturer manuf);
}

我在这里看到很多问题。

  1. Database做得太多了。
  2. 这些对象在真正读取时可能是不可变的,唯一的问题是在插入之后,我不确定它们被分配了什么 ID,并且插入的对象现在已经过时了。
  3. 每当一个类需要从 中获取信息时Database,我都必须添加另一个 Get 方法来处理特定查询。

我真的不知道正确的实现是什么。我唯一真正的改进想法是某种数据库对象的基本接口,尽管它可能只有助于插入......

public interface IDatabaseObject
{
    void Insert(Database db);
    bool Delete(Database db);
}

什么是实际实现这一点的好方法?

4

2 回答 2

4

那么在保持 SRP(或任何其他类型的健全模式)的同时使用 DB 的最佳解决方案是使用某种 ORM(例如,NHibernate)。

这将允许您按原样使用类,而不是手动将它们从/到 DB。

例如,使用 NH,您的类可以如下所示:

public class Manufacturer
{
  public string Name { ... }
  public IList<Probe> Probes { ... }
}

public class Probe
{
  public string Name { ... }
  public int Elements { ... }
  public ProbeSettings Settings { ... }
}

public class ProbeSettings
{
  public int RandomSetting;
}

如您所见,您已经不需要,GetProbesFromManufacturer因为您可以在制造商中导航集合。

此外,ORM 将管理对象 ID 并为您保存。因此,您所需要的只是一小部分固定数量的通用方法,例如 LoadById/LoadAll,它们非常适合用于数据访问的类 SRP。此外,对于数据库的每个复杂且可配置的查询,您可能都需要一个类。

于 2010-01-20T21:29:32.977 回答
2

听起来您正在寻找ORM。由于您使用的是 C#,因此我假设您可以访问LinqToSQL作为 .NET 框架的一部分。就管理您的基本CRUD操作而言,Linq 可以满足您的需求。类似的项目,也值得一试,是Castle ActiveRecordNHibernate。

于 2010-01-20T21:27:46.040 回答