设计模式:保存私人会员

时间:2012-04-09 21:19:17

标签: c# database design-patterns

假设我们有一个类Potato(和因此实例),它具有属性平滑性,用于其他方法但不假装是公共的。创建实例时会设置此属性,并且仅在实例内部使用该属性。

此外,我的系统应该支持多个数据库驱动程序,因此我有一个接口“数据库适配器”,它将使用我想要使用的驱动程序的类进行实例化。

现在出现了问题。我需要使对象(马铃薯)持久化并将其保存到数据库中,因此我应该使用数据库适配器类来保存马铃薯的平滑度,但是......它是私有的! 我怎样才能发送马铃薯的光滑度而不能将其用于其他目的?

提前致谢

3 个答案:

答案 0 :(得分:2)

编写一个允许对象保存自身的方法,将某种类型的编写器作为参数。由于这是一个数据库,您可能需要同时使用Insert和Update方法,而不仅仅是Save方法。您也可以将它们放入界面中。

粗略的例子:

public interface IDatabaseSaveable
{
   void InsertToDatabase(Database pDatabase);
   void UpdateDatabase(Database pDatabase);
}

public class Potato : IDatabaseSaveable
{
   private int mID;
   private double mSmoothness;

   public void InsertToDatabase(Database pDatabase)
   {
      pDatabase.InsertToPotatoes(mID, mSmoothness, ...);
   }

   public void UpdateDatabase(Database pDatabase)
   {
      pDatabase.UpdatePotatoes(mID, mSmoothness, ...);
   }
}

答案 1 :(得分:2)

您可以创建导入器/导出器接口对,以外部化Potato的“状态”,而无需访问其实现详细信息(在本例中为其私有成员和数据类型)。他们是建设者的类型。

public class Potato {
  public interface IExporter {
    void AddSmoothness(string value);
  }
  public interface IImporter {
    string ProvideSmoothness();
  }

  public Potato(IImporter importer) {
    this.smoothness = int.Parse(importer.ProvideSmoothness());
  }

  public void Export(IExporter exporter) {
    exporter.AddSmoothness(this.smoothness.ToString());
  }

  public Potato(int smoothness) {
    this.smoothness = smoothness;
  }

  private int smoothness;
}

然后,您的数据库适配器类将实现相关接口并使用相应的方法。看here了解最初的想法。

答案 2 :(得分:1)

这是将平滑属性标记为internal的变体。假设马铃薯必须具有smoothness设置才能使用它,内部构造函数可能会更好。我会凭信心接受,有理由隐藏顺畅。或许马铃薯的谦虚?

public class Potato
{
    internal int Smoothness { get; set; }

    internal Potato(int smoothness)
    {
        this.Smoothness = smoothness;
    }
    private Potato() { }
}

只有同一程序集中的类才能使用内部构造函数实例化Potato。并且只有同一个程序集中的类才能访问平滑度(因此它们可以保存马铃薯。)