我对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();
}
}
答案 0 :(得分:1)
应该根据类的预期功能来驱动继承。在您的情况下,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
}
}
答案 1 :(得分:0)
如果BusinessLogicX类有意查询其模块的数据 DB,这并不意味着BusinessLogicX类具有相同的功能 DBConnector的功能(它可以连接到数据库)?
没有。这是不正确的,BL(业务逻辑)和DB(存储)之间的继承是不可能的。
分离关注:
您的业务类只需要数据,不应该关心检索它的机制。事实上,它甚至不知道是从MSSQL,Oracle还是仅仅是基于文件的数据源检索数据。这是数据访问层或类的头痛问题。当你去咖啡馆时,对你来说最重要的是你订购的一杯咖啡,而不是他们如何准备它!
正如@milindmb正确指出的那样,如果适用,你应该在基本BL中放置常见行为。您可以将基本BL标记为abstract
而不是具体。
<强> DbConnector 强>:
我建议为此定义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是否使用构成应用程序数据访问层的存储库。它们的使用取决于您的应用范围。