-4

次のパターンで3層のWinFormアプリケーションを作成しています。

--MY BASE CLASS: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;
    }
}

--USE これは私の基本クラスを使用する方法です

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

質問

  • これは私がフォローしている正しいアーキテクチャですか?基本クラスをシングルトンとして作成する機会はありますか?
  • 他にバッターアーキテクチャはありますか?
  • 機能を拡張するために従うことができるパターンはありますか?

親切に提案します。

4

3 に答える 3

0

Anand が提案したように、基本クラスからすべての SQL 関連関数を削除し、それらをすべて別のクラスに配置しましたSql

その後、Sqlクラスをシングルトンにしました。そして、すべての DAL クラスでアクセスできるように、Sqlインスタンスを格納しました。BaseDAL

私のコードは次のようになります

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はなくフィールドとして公開されます。元のソリューションでは、それらはプロパティでした。また、Personクラスの実装を支援するために、BaseDAL にデータをクエリするメソッドがあります。

于 2012-06-01T04:53:56.667 に答える
0

これは私が従っている正しいアーキテクチャですか

コンテキストのない問題に最適なアーキテクチャはありません。そうは言っても、あなたの人生をより困難にするためにできることがあります。シングルトンは、実装の問題ではありません。

他の打者アーキテクチャはありますか?

おそらくそうだ。コードをちらりと見ただけで、近い将来、そうではない将来にあなたを傷つける可能性のあるものがかなりたくさんあります。

まず、アドバイスを 1つ。基本を正しく理解して、歩けるようになる前に走らないようにしましょう。これがマイナス票の原因かもしれません。

いくつかのランダムな問題:

  • あなたは 3 層アーキテクチャについて話しているのですが、技術的にはそこには層がなく、レイヤーさえありません。Person私にはビジネス ロジックのようには見えません。私の理解が正しければ、コマンドを実行するための文字列も提供する必要があるため、SQL を認識している必要があります。
  • 空の仮想メソッドは抽象化する必要があります。任意の SQL を実行できるようにしたい場合は、これをクラスの外に移動します
  • @Anandが指摘したように、クエリする方法はありません
  • CommandName と Parameters は、プロパティではなくフィールドとして公開されます
  • CommandName は名前ではありません。ドメインはそのクラスにふさわしい名前ではないようです
  • これは、よく知られた問題 (ORM) に対する厄介な解決策のように見えます。あなたはカスタム SQL を実行できるようにしたいと言っていますが、まともな ORM ならそれができるはずです。

推奨される読み物:基本的なものについてはCode Completeを、必要なアーキテクチャ パターンを明確にするために Enterprise 向けのアプリケーションの設計を参照してください。

于 2012-05-31T13:53:26.487 に答える