-4

我只是用以下模式创建一个 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 CLASS

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;
    }
}

-- USE 这是使用我的基类的方式

void Main()
{
    Person p = new Person();
    p.name = "Vijay";
    p.number = "23";
    p.Save();
}

问题

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

请建议。

4

3 回答 3

1

让我们来看看。我会尽力提供我的意见。我在这里看到你正在尝试做的是 ORM。所以请将基类的名称从 Domain 更改为其他名称

这是我遵循的正确架构吗?是否有机会将基类创建为单例?

为什么你需要你作为单例的基类。您将继承您的基类,并创建子类的实例。永远不会创建 base 本身的实例。(99% 次 :))

还有其他面糊架构吗?

明白此事。做某件事,可能有多种方法。这只是事实上,哪一个最适合你。

我可以遵循任何模式来扩展我的功能吗?

永远记住 SOLID 原则,它为您提供松散耦合并允许轻松扩展。

坚硬的

我建议进行一些更改。不是基类,而是从接口开始,然后继承它来创建一个抽象类。

还要确保您的基类可以执行所有 CRUD 功能。我在这里看不到检索功能。你打算怎么做?可能您需要一个返回应用程序所有实体的存储库类。因此,当您需要人员时,您只需继续要求存储库返回所有人员。

总而言之,有很多 ORM 工具可以实现这种功能并节省开发人员的时间。最好学习这些技术。例如 LINQ - SQL。

于 2012-05-31T11:16:45.083 回答
0

正如 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该类。

于 2012-06-01T04:53:56.667 回答
0

这是我遵循的正确架构吗

对于没有上下文的任何问题,没有架构是最佳的。也就是说,你可以做一些事情来让你的生活变得更加困难。单例在您的实施中不是您的问题。

还有其他面糊架构吗?

大概是。只是瞥一眼代码,我看到很多东西会在不久的将来伤害你,而不是那么近的将来。

首先,一条忠告:把基础搞好,在会走路之前不要跑。这可能是反对票的原因。

一些随机问题:

  • 您在谈论 3 层架构,但从技术上讲,那里没有层,甚至没有层。Person对我来说看起来不像业务逻辑:如果我理解正确,它还必须提供要执行的命令的字符串,所以它必须知道 SQL。
  • 空虚方法应该是抽象的。如果您希望能够执行任意 SQL,请将其移出类
  • 正如@Anand 指出的那样,没有方法可以查询
  • CommandName 和 Parameters 公开为字段而不是属性
  • CommandName 不是名称,域看起来不像该类的合适名称
  • 它看起来像是一个众所周知的问题(ORM)的尴尬解决方案。您说您希望能够执行自定义 SQL,但任何体面的 ORM 都应该能够让您做到这一点。

建议阅读:基本内容的代码完成和企业架构应用程序,以明确您可能需要的架构模式。

于 2012-05-31T13:53:26.487 回答