我对OOP中的继承概念有一些疑问。当我刚刚完成自定义类的编码以连接数据库时。
例如
`// for encapsulate some method under and use as the team's custom
// version of DBconnect
public class DBconnector()
{
public void SetConnection(); // setting
public void BeginCon(); // setting
public void SetQuery(String i_Query , CommandType cmdType); // setting
public Object GetExcetue();
... // other setting
}`
然后系统具有单独的业务逻辑分类,它将获取其模块的内容(数据),如BusinessLogicM1,BusinessLogicM2,BusinessLogicM3...
这些单独的分类将使用 DBconnector 中的功能从 Db 获取数据。所以我在这里很困惑我是否应该通过继承 DBconnector 类来编码 BusinessLogic 类,只使用 DBconnector 的方法。public class BusinessLogicX :DBconnector
{
public Object GetXData()
{
...// setting
return this.GetExcetue();
}
}
或public class BusinessLogicX
{
public Object GetXData()
{
var service = new DBconnector();
...//setting
return service.GetExcetue();
}
}
继承应根据类的预期功能来驱动。在您的情况下,DBConnector 类的功能是管理数据库连接/查询,BusinessLogicX 类的功能是实现业务逻辑。因此,这两个类是不相关的,因此不应该有继承。 我建议你可以只使用DBConnector类的方法。
在你的BusinessLogic实现中,如果BusinessLogicM1、BusinessLogicM2..共享任何共同的行为,那么你应该将继承构建为
class BaseBusinessLogic
{
public void commonMethod1()
{
}
public void commonMethod2()
{
}
public Object GetXData()
{
var service = new DBconnector();
...//setting
return service.GetExcetue();
}
}
Class BusinessLogicM1 : BaseBusinessLogic
{
public void M1LogicMethod()
{
..........
}
}
您还可以考虑将DBConnector作为BaseBusinessLog类的成员,因此可以在一个地方维护数据库连接。
。具有 DBConnector 作为成员的 BaseBusinessLogic 类的示例
class BaseBusinessLogic
{
private DBconnector _connector;
public void initConnector( DBConnector iConnector)
{
this._connector = iConnector;
}
public void commonMethod1()
{
}
public void commonMethod2()
{
}
public Object GetXData()
{
...//setting
_connector.SetQuery("..."); // Query to get 'X' Data
return _connector.GetExcetue();
}
}
Class BusinessLogicM1 : BaseBusinessLogic
{
public void M1LogicMethod()
{
// Fetch DataList from DBConnector
_connector.SetQuery(".....");
Object obj = _connector.GetExecute();
Object xData = GetXData();
// use obj and xData Object to build BusinessLogicM1
}
}
如果BusinessLogicX类打算从 DB,不是说BusinessLogicX类具有相同的吗? DBConnector 的功能(它可以连接到数据库) ?
不。这是不正确的,BL(业务逻辑)和DB(存储)之间的继承是毫无疑问的。
关注点分离:
您的业务类只需要数据,而不必担心检索数据的机制。事实上,它甚至不应该知道数据是从MSSQL,Oracle还是仅仅基于文件的数据源中检索的。这都是数据访问层或类的头疼问题。当你去咖啡店时,对你来说重要的是你订购的一杯咖啡,而不是他们如何准备!
正如@milindmb正确指出的那样,如果适用,您应该将常见行为放在基本 BL 中。您可以将基础 BL 标记为abstract
而不是混凝土。
数据库连接器:
我建议为此定义一个interface
,并将其作为依赖项注入 BL 类中的实现。请注意,接口对于依赖关系注入不是必需的。您可以注入类类型,并在@milinmb的基本 BL 类中显示。接口增加了一个优点,即在对业务逻辑类进行单元测试时,可以模拟它们。那是另一回事了。所以通常你的商务舱看起来像下面这样(我喜欢称它们为服务。这是您的选择):
public abstract class ServiceBase {
protected readonly IDbConnector dbConnector;
public ServiceBase(IDbConnector dbConnector) {
this.dbConnector = dbConnector;
}
}
public class UserService : ServiceBase {
public UserService(IDbConnector dbConnector) : base(dbConnector) {
}
// use dbConnector from ServiceBase
}
拥有IDBConnector
意味着,将来您将能够根据您正在使用的数据源注入不同的实现,例如:SqlConnector,OracleConnector等。 上面显示了构造函数注入,这是一种类型的依赖注入(DI)。还有方法和二传手(使用属性)注入。因为有时依赖项是可选的,您可能希望在不注入它们的情况下创建类实例。详细了解 DI。
存储库:
这将超出范围,所以我把它留给你研究。检查 Google 是否使用了构成应用程序数据访问层的存储库。它们的用法取决于应用程序的范围。