0

我有 2 个非常相似的 sql 表。每个表只有外键不同。

TemplateUnit table:

Id (PK)
ParentId
Name
TemplateId (FK)

TestplanUnit table:

Id (PK)
ParentId
Name
TestplanId (FK)

当我选择 2 个内容几乎相同的表时——只是 FK 不同——你真的在你的服务和数据提供者中创建了你的 CRUD 方法的副本(使用 ado.net pure)吗?

如何改进服务,以便在服务和数据提供者类中只使用一种 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

我认为如果您像以下步骤一样明确指定您的类型会更好。

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 回答
0

好的,我建议您不要合并 CRUD 操作。为什么Unit可以存储在两个表中?您的域中必须有某种规则来确定将其存储在哪个表中?此“规则”表明您的单元可以具有多个含义/定义/规范,无论它可能多么轻微。当这些规范中的一个发生变化时(可能是额外的列等),您将留下一组 CRUD 操作,这些操作会被条件语句混淆,这可能会变得复杂。

如果这两个单元之间存在根本区别,我什至会说创建单独的业务对象,并使用它们自己的规则。保持你的设计纯粹,保持独立。是的,它的代码更多,但更简单。

于 2012-06-22T07:55:44.893 回答