实现逻辑的最佳方法,因此两个相似的类具有相同的功能以及不同的功能

时间:2019-06-16 11:58:49

标签: c# polymorphism data-access-layer factory-pattern

我正在尝试建立一个数据库访问层,该层可以与SQL db以及一些noSQL DB进行通信。我正在考虑拥有一个像IDataManager这样的接口,该接口具有诸如GetData(),putData(),addTable(),dropTable()之类的通用功能,并且两个Db都可以具有独立的功能,例如noSQL DB可以允许从XML或平面插入数据文件等 我该如何在客户端代码中为这种层次结构实现工厂逻辑或访问逻辑?

interface IdataManager 
{
   getData();
   putData();
   addTable();
   dropTable();
}

class NoSQLManager : Idatamanager
{
   //implements all common functions
   getData();
   putData();
   addTable();
   dropTable();

   //also declares some additional ones 
   putDatausingXML();
}

class SQLManager : Idatamanager
{
   //implements all common functions
   getData();
   putData();
   addTable();
   dropTable();

   //also declares some additional ones 
   putDatausinglocaltable();
}

//Now in my code to access above DAL logic , lets say I create a simple factory 

class dataAccessFactory 
{
  IdataManager getDataManager(int id)
  {
    dataManager dm = null;
    if(id==1)
      dm = new NoSQLManager();
    else if(id==2)
      dm = new SQLManager();
    return dm;
  }
}

Logic to access above factory :

dataAccessFactory daf = new dataAccessFactory ();
IdataManager noSqlObj = daf.getDataManager(1);
noSqlObj.putDatausingXML(); //problem this wont work.

我希望能够使用noSqlObj访问诸如putDatausingXML之类的额外功能以及诸如getData()之类的常用功能

但是使用给定的继承和逻辑,我将只能访问基本接口IdataManager的一部分的功能。

1 个答案:

答案 0 :(得分:0)

接口的重点是使下一层可以使用接口的方法编写代码,而不必担心基础实现。您试图做的事情首先使使用接口无效。如果您需要调用putDataUsingXML()之类的东西,则调用者会意识到他们需要一个NOSQL风格的数据库,而不是SQL数据库。甚至您的变量名都是noSqlObj。那么创建一个旨在隐藏这些细节的界面有什么意义呢?

如果确实需要执行此操作,则可以将接口转换为基础实现。

((NoSqlManager)noSqlObj).putDatausingXML();

但是您应该真正在这里重新评估您要完成的工作。