كيف تتعامل مع طرق الخدمة على جدولين متشابهين للغاية

لدي 2 جداول sql التي متشابهة جداً. يختلف المفتاح الخارجي فقط لكل جدول.

TemplateUnit table:

Id (PK)
ParentId
Name
TemplateId (FK)

TestplanUnit table:

Id (PK)
ParentId
Name
TestplanId (FK)

عندما أذهب إلى جدولين يحتويان على نفس المحتوى - فكلمة FK مختلفة - هل تقوم بالفعل بإنشاء نسختين من طرق CRUD في خدمتك و dataprovider (باستخدام ado.net pure)؟

كيف يمكن تحسين الخدمة بحيث يتم استخدام نوع واحد فقط من طرق الحصول/إضافة/تحديث/حذف في فئة الخدمة وداتابروفيدير؟ أنا أيضا لا أريد أن أجري اختبارات وحدة مكررة ...

تحديث:

هذا هو الحل حتى الآن:

public class Unit
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public Nullable 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,
    }

الحصول على طرق Get/Add/Delete في BLL و DAL الحصول على كائن UnitDTO مع كافة المعلومات المطلوبة.

قد يكون أحد عيوبه - إذا تم تنفيذ هذا المشروع في فريق - أن عليك أن تعرف المتغير المستخدم/المطلوب في DAL عند إنشاء UnitDTO وتمريره إلى BLL لكل طريقة CRUD.

ما رأيك؟

0

2 إجابة

أعتقد أنه سيكون من الأفضل أن تحدد نوعك بوضوح مثل الخطوات التالية.

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

public abstract class UnitBase
{   
    public int Id { get; set; }
    public Nullable 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;
            }
        }

    }

بهذه الطريقة ، عندما يتصل أشخاص آخرون برمزك ، فإنهم يعرفون بالضبط نوع الوحدة التي يعملون معها ، ويمكنك تجنب تكرار الشفرة. نأمل أن تكون هذه المساعدة.

0
وأضاف
لقد غيرت DAL. حتى بلدي BLL (UnitService) لا يزال لديه كل الأساليب لطاولتين مختلفتين. ستكون وحدات القالب هي نفسها دائمًا وحدة اختبار ، لأن وحدة testplan هي نسخة/نسخة احتياطية لوحدة القوالب. وبالتالي فإن المكالمة من فئة تحكم asp.net mvc ستكون unitService.Insert (وحدة)؟
وأضاف المؤلف Elisabeth, مصدر

حسنًا ، سأقترح عليك عدم الجمع بين عمليات CRUD. لماذا يمكن تخزين الوحدة في جدولين؟ يجب أن يكون هناك نوع من القاعدة في المجال الذي يحدد الجدول الذي يخزنها؟ هذه "القاعدة" هي إشارة إلى أن وحدتك يمكن أن يكون لها أكثر من معنى/تعريف/مواصفة ، مهما كان طفيفًا. في اللحظة التي تتغير فيها إحدى هذه المواصفات (ربما عمود إضافي وما إلى ذلك) ، سيتم تركك مع مجموعة واحدة من عمليات CRUD التي ستتعرض للدمار من خلال عبارات مشروطة ، وهذا يمكن أن يصبح معقدًا.

إذا كان هناك اختلاف جوهري بين الوحدتين ، سأذهب إلى حد قول إنشاء كائنات أعمال منفصلة ، مع القواعد الخاصة بها. حافظ على تصميمك خالصًا ، احتفظ به منفصلاً. نعم ، إنه رمز أكثر ولكنه أكثر بساطة.

0
وأضاف
ليس أكثر من رمز سيكون دائما رمز مكرر. إذا قمت بتغيير واحد testplanUnitService لدي لتغيير الآخر أيضا. كلا الجدولين حفظ البيانات نفسها ، الفرق هو مجرد المفتاح الخارجي. يقوم جدول الوحدة الواحدة بتخزين وحدات القالب. تقدم testplans نسخة من جميع وحدات القالب ولكنها مخزنة في جدول الوحدة الأخرى بسبب المفتاح الخارجي الآخر.
وأضاف المؤلف Elisabeth, مصدر