具有单一实例模式的 3 层应用程序
本文关键字:应用程序 模式 单一 实例 | 更新日期: 2023-09-27 18:35:46
我只是使用以下模式创建一个 3 层 WinForm 应用程序。
-- 我的基地班 : DAL 班
public class Domain
{
public string CommandName = string.Empty;
public List<Object> Parameters = new List<Object>();
public void Save()
{
List<Object> Params = this.SaveEntity();
this.ExecuteNonQuery(CommandName, Params.ToArray());
}
public void Delete()
{
List<Object> Params = this.DeleteEntity();
this.ExecuteNonQuery(CommandName, Params.ToArray());
}
public void Update()
{
List<Object> Params = this.UpdateEntity();
this.ExecuteNonQuery(CommandName, Params.ToArray());
}
protected virtual List<Object> SaveEntity()
{
return null;
}
protected virtual List<Object> UpdateEntity()
{
return null;
}
protected virtual List<Object> DeleteEntity()
{
return null;
}
public int ExecuteNonQuery(string SqlText, params object[] Params)
{
/*
* Code block for executing Sql
*/
return 0;
}
}
我的业务层类,它将继承DLL类
-- 我的孩子班 : BLL班
public class Person : Domain
{
public string name
{
get;
set;
}
public string number
{
get;
set;
}
protected override List<object> SaveEntity()
{
this.Parameters.Add(name);
this.Parameters.Add(number);
return this.Parameters;
}
}
--用这是使用我的基类的方式
void Main()
{
Person p = new Person();
p.name = "Vijay";
p.number = "23";
p.Save();
}
问题
- 这是我遵循的正确体系结构吗,是否有机会将基类创建为单例?
- 还有其他面糊架构吗?
- 我可以遵循任何模式来扩展我的功能吗?
恳请建议。
让我们看看。我会尝试提供我的意见。我在这里看到你试图做的是ORM。因此,请将基类的名称从域更改为其他名称
这是我遵循的正确体系结构吗,是否有机会将基类创建为单例?
为什么需要基类作为单例。您将继承基类,并创建子类的实例。你永远不会创建base本身的实例。(99% 倍:) )
还有其他面糊架构吗?
明白这一点。要做某件事,可能有多种方法。这只是事实问题,哪一个最适合你。
我可以遵循任何模式来扩展我的功能吗?
永远记住 SOLID 原则,它为您提供松散耦合并允许轻松扩展。
固体
我建议进行一些更改。而不是基类,从 Interface 开始,然后继承它以创建一个抽象类。
还要确保基类可以执行所有 CRUD 功能。我在这里看不到检索功能。你打算怎么做?可能您需要一个返回应用程序所有实体的存储库类。因此,当您需要 Person 时,您只需继续要求存储库返回所有 Person。
总而言之,有很多ORM工具可以执行此类功能并节省开发人员的时间。最好学习这些技术。例如 LINQ - SQL。
这是我遵循的正确架构吗
没有上下文的架构是最适合任何问题的。也就是说,你可以做一些事情来让你的生活更加困难。单例不是实现中的问题。
还有其他面糊架构吗?
可能,是的。只是瞥一眼代码,我看到很多东西在不久的将来会伤害你,而不是那么近的将来。
首先,一条建议:正确掌握基础知识,不要在可以走路之前跑步。这可能是反对票的原因。
一些随机问题:
- 您谈论的是 3 层架构,但从技术上讲,那里没有层,甚至没有层。 对我来说,
Person
看起来不像业务逻辑:如果我理解正确,它还必须提供要执行的命令的字符串,因此它必须知道 SQL。 - 空的虚拟方法应该是抽象的。如果您希望能够执行任意 SQL,请将其移到类之外
- 正如@Anand指出的,没有查询方法
- 命令名称和参数作为字段而不是属性公开
- CommandName 不是 Name,Domain 看起来不像该类的合适名称
- 它看起来像是一个众所周知的问题(ORM)的尴尬解决方案。你说你希望能够执行自定义SQL,但任何体面的ORM都应该能够让你这样做。
为您推荐: 基本内容的代码完成 和 企业架构应用程序 以明确您可能需要的架构模式。
正如 Anand 所建议的,我从基类中删除了所有与 SQL 相关的函数,并将它们全部放在另一个类中,Sql
.
之后,我把Sql
班变成了单身人士。我将Sql
实例存储在BaseDAL
中,以便可以在所有 DAL 类中访问它。
我的代码看起来像这样
public class BaseDAL
{
// Singleton Instance
protected Sql _dal = Sql.Instance;
public string CommandName = string.Empty;
public List<Object> Parameters = new List<Object>();
public void Save()
{
List<Object> Params = this.SaveEntity();
_dal.ExecuteNonQuery(CommandName, Params.ToArray());
}
public void Delete()
{
List<Object> Params = this.DeleteEntity();
_dal.ExecuteNonQuery(CommandName, Params.ToArray());
}
public void Update()
{
List<Object> Params = this.UpdateEntity();
_dal.ExecuteNonQuery(CommandName, Params.ToArray());
}
protected virtual List<Object> SaveEntity()
{
return null;
}
protected virtual List<Object> UpdateEntity()
{
return null;
}
protected virtual List<Object> DeleteEntity()
{
return null;
}
// Other functions, like DataTable and DataSet querying
}
新的 SQL 类是
public class Sql
{
// All other functions are also present in this class for DataTable DataSet and many other
// So this class is more then enough for me.
public int ExecuteNonQuery(string SqlText, params object[] Params)
{
// Code block for executing SQL
return 0;
}
}
CommandName
和Parameters
作为字段而不是属性公开。在原始解决方案中,它们是属性。此外,我在 BaseDAL 中有一个方法来查询数据,以帮助实现 Person
类。