具有单一实例模式的 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();
}

问题

  • 这是我遵循的正确体系结构吗,是否有机会将基类创建为单例?
  • 还有其他面糊架构吗?
  • 我可以遵循任何模式来扩展我的功能吗?

恳请建议。

具有单一实例模式的 3 层应用程序

让我们看看。我会尝试提供我的意见。我在这里看到你试图做的是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;
    }
}

CommandNameParameters作为字段而不是属性公开。在原始解决方案中,它们是属性。此外,我在 BaseDAL 中有一个方法来查询数据,以帮助实现 Person 类。