【问题标题】:Best way to implement logic so two similar classes have common as well as different functionality实现逻辑的最佳方式,因此两个相似的类具有共同和不同的功能
【发布时间】:2019-06-16 11:58:49
【问题描述】:

我正在尝试设置一个可以与 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# polymorphism data-access-layer factory-pattern


    【解决方案1】:

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

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

    ((NoSqlManager)noSqlObj).putDatausingXML();
    

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

    【讨论】:

    • 没错,同意。但是有没有像工厂方法模式这样的方法,您可以在其中拥有两种实现共有的业务逻辑 - NoSqlManager 和接口 IdataManager 的 SQLManager 以及特定于它们。对于业务逻辑,您可以创建特定的工厂并在其中包含业务逻辑。但是如何为两种实现可能不同的功能做类似的事情 - 如果有类似的方法可以从客户端抽象出来。
    • 另外,如果我创建两个单独的接口,一个用于通用功能,另一个用于特定功能,并让 NoSqlManager 类实现两者——有没有办法以抽象方式访问这两组功能,而不是创建 NoSqlManager 的实例
    • 是的,您可以拥有一个 NoSqlManager 实例(如果您愿意,可以从工厂获得)并继续将其转换为它实现的多个不同接口。那会奏效的。
    • 感谢您的建议,将尝试一下,看看是否适用于我的情况:)
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多