C# 如何处理两个非常相似的sql表上的服务方法
我有两个非常相似的sql表。每个表只有外键不同C# 如何处理两个非常相似的sql表上的服务方法,c#,sql,ado.net,data-access-layer,business-logic-layer,C#,Sql,Ado.net,Data Access Layer,Business Logic Layer,我有两个非常相似的sql表。每个表只有外键不同 TemplateUnit table: Id (PK) ParentId Name TemplateId (FK) TestplanUnit table: Id (PK) ParentId Name TestplanId (FK) 当我选择两个内容几乎相同的表时-只是FK不同-您真的在服务和数据提供程序中创建CRUD方法的副本吗(使用ado.net pure) 如何改进服务,使服务和数据提供者类中只使用一种Get/Add/Update/De
TemplateUnit table:
Id (PK)
ParentId
Name
TemplateId (FK)
TestplanUnit table:
Id (PK)
ParentId
Name
TestplanId (FK)
当我选择两个内容几乎相同的表时-只是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,
}
公共类单元
{
公共字符串名称{get;set;}
公共int Id{get;set;}
公共可为空的ParentId{get;set;}
public int TemplateId{get;set;}
公共bool IsLazy{get;set;}
}
公共类单位
{
公共单元DTO(单元模式)
{
开关(模式)
{
案例单元模式。模板:
this.ForeinKeyName=“TemplateId”;
this.TableName=“TemplateUnit”;
打破
案例UnitMode.Testplan:
this.ForeinKeyName=“TestplanId”;
this.TableName=“TestplanUnit”;
打破
}
UnitBO=新单位();
}
公共字符串表名{get;private set;}
公共字符串ForeinKeyName{get;private set;}
公共单位UnitBO{get;private set;}
}
公共枚举单元模式
{
模板=0,
Testplan=1,
}
BLL和DAL中的My Get/Add/Delete方法获取一个UnitDTO对象,其中包含所有需要的信息
一个缺点是,如果这个项目是在一个团队中完成的,那么在创建UnitDTO并将其传递给每个CRUD方法的BLL时,您必须知道DAL中使用/需要哪个变量
您认为如何?我认为,如果您像下面的步骤那样显式地指定您的类型会更好
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)
{}
}
通过这样做,当其他人调用您的代码时,他们确切地知道他们使用的是哪种类型的单元,您可以避免重复代码。希望这有帮助。好的,我建议您不要合并CRUD操作。为什么该单元可以存储在两个表中?您的域中必须有某种类型的关闭规则来决定将其存储在哪个表中?此“规则”表示您的单元可以有多个含义/定义/规格,无论其程度如何轻微。一旦这些规范中的一个发生变化(可能是一个额外的列等),您将只剩下一组CRUD操作,这些操作将被条件语句弄得一团糟,这可能会变得复杂
如果这两个单元之间有根本性的区别,我甚至会说使用它们自己的规则创建单独的业务对象。保持你的设计纯粹,保持独立。是的,它的代码更多,但更简单。它的代码并不多,它总是重复的代码。如果我更改一个testplanUnitService,我也必须更改另一个。两个表保存相同的数据,不同之处只是外键。“一个单位”表存储模板的单位。testplans复制了一个模板的所有单元,但由于另一个外键而存储在另一个单元表中。您更改了DAL。所以我的BLL(UnitService)对于两个不同的表仍然有相同的方法。模板的单元将始终与测试计划的单元相同,因为测试计划单元是模板单元的副本/备份。那么来自asp.net mvc控制器类的调用将是unitService.Insert(unit)?
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;
}
}
}