首页 > 解决方案 > 实现逻辑的最佳方式,因此两个相似的类具有共同和不同的功能

问题描述

我正在尝试设置一个可以与 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 的部分功能。

标签: c#polymorphismdata-access-layerfactory-pattern

解决方案


接口的意义在于,下一层可以使用接口的方法编写代码,而不必担心底层实现。您尝试做的事情首先使使用接口的意义无效。如果你需要调用类似的东西,putDataUsingXML()那么调用者就会知道他们需要一个 NOSQL 风格的数据库,而不是一个 SQL 数据库。甚至你的变量名也是noSqlObj. 那么创建一个声称隐藏这些细节的界面有什么意义呢?

如果你真的需要这样做,你可以将接口转换为底层实现。

((NoSqlManager)noSqlObj).putDatausingXML();

但是你真的应该重新评估你在这里想要完成的事情。


推荐阅读