0

非常によく似た2つのSQLテーブルがあります。テーブルごとに異なるのは外部キーだけです。

TemplateUnit table:

Id (PK)
ParentId
Name
TemplateId (FK)

TestplanUnit table:

Id (PK)
ParentId
Name
TestplanId (FK)

ほぼ同じコンテンツを持つ 2 つのテーブル (FK が異なるだけ) を使用する場合、サービスとデータプロバイダー (ado.net pure を使用) で CRUD メソッドの複製を本当に作成しますか?

サービスとデータプロバイダー クラスで 1 種類の Get/Add/Update/Delete メソッドのみが使用されるように、サービスをどのように改善しますか? また、単体テストを重複させたくありません...

アップデート:

これはこれまでの私の解決策です:

public class Unit
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public Nullable<int> ParentId { get; set; }
        public int TemplateId { get; set; }      
        public bool IsLazy { get; set; }         
    }



public class UnitDTO
    {
        public UnitDTO(UnitMode mode)
        {
            switch (mode)
            {
                case UnitMode.Template:
                    this.ForeinKeyName = "TemplateId";
                    this.TableName = "TemplateUnit";
                    break;
                case UnitMode.Testplan:
                    this.ForeinKeyName = "TestplanId";
                    this.TableName = "TestplanUnit";
                    break;
            }

            UnitBO = new Unit();
        }

        public string TableName { get; private set; }        
        public string ForeinKeyName { get; private set; }
        public Unit UnitBO { get; private set; }
    }

    public enum UnitMode
    {
        Template = 0,
        Testplan = 1,
    }

BLL と DAL の Get/Add/Delete メソッドは、必要なすべての情報を含む UnitDTO オブジェクトを取得します。

このプロジェクトがチームで行われる場合、UnitDTO を作成し、それを各 CRUD メソッドの BLL に渡すときに、DAL でどの変数が使用/必要とされるかを知る必要があるという欠点があります。

どう思いますか?

4

2 に答える 2

0

わかりました、CRUD 操作を組み合わせないことをお勧めします。Unit を 2 つのテーブルに格納できるのはなぜですか? どのテーブルに保存するかを決定する、ドメイン内の何らかのオフルールが必要ですか? この「ルール」は、あなたの単位が、たとえわずかであっても、複数の意味/定義/仕様を持つことができることを示しています。これらの仕様の 1 つが変更された瞬間 (列の追加など)、条件ステートメントによって混乱する一連の CRUD 操作が残り、複雑になる可能性があります。

2 つのユニットに根本的な違いがあるとすれば、独自のルールを使用して個別のビジネス オブジェクトを作成するということです。デザインを純粋に保ち、分離してください。はい、それはより多くのコードですが、より単純です。

于 2012-06-22T07:55:44.893 に答える
0

以下の手順のように型を明示的に指定した方が良いと思います。

public enum TableTypeEnum
{
    Template =0,
    TestPlan =1
}

public abstract class UnitBase
{   
    public int Id { get; set; }
    public Nullable<int> ParentId { get; set; }
    public string Name { get; set; }

    public TableTypeEnum TableType { get; private set; }


    protected UnitBase(TableTypeEnum  type)
    {
        TableType = type;
    }
}

public class TemplateUnit:UnitBase
{
    public int TemplateForeignKeyId { get; set; }
    public TemplateUnit() : base(TableTypeEnum.Template)
    {}
}

public class TestPlanUnit:UnitBase
{
    public Guid TestplanForeignKeyId { get; set; }
    public TestPlanUnit():base(TableTypeEnum.TestPlan)
    {}
}

DALクラスは次のようになります

public class  DAL
    {
        public void Insert(UnitBase unit)
        {
            switch (unit.TableType)
            {
                case  TableTypeEnum.Template:
                    //insert into the template table
                    break;
                case TableTypeEnum.TestPlan:
                     //insert into the testplan table
                    break;
            }
        }

    }

こうすることで、他の人があなたのコードを呼び出すときに、どのタイプのユニットを使用しているかを正確に知ることができ、コードの重複を避けることができます。この助けを願っています。

于 2012-06-22T00:19:32.943 に答える