2012-06-21 1 views
0

2 개의 SQL 테이블이 매우 유사합니다. 외래 키만 각 테이블마다 다릅니다.당신은 2 개의 매우 유사한 SQL 테이블에 대한 서비스 메소드를 어떻게 처리합니까?

TemplateUnit table: 

Id (PK) 
ParentId 
Name 
TemplateId (FK) 

TestplanUnit table: 

Id (PK) 
ParentId 
Name 
TestplanId (FK) 

나는 거의 같은 내용이이 개 테이블에 대한 이동 - 바로 FK가 다르다 - 당신은 정말 당신의 서비스와의 dataProvider에 CRUD 방법의 중복을 만들려면 어떻게해야합니까 (ado.net 순수한 사용)?

서비스 및 dataprovider 클래스에서 한 가지 종류의 가져 오기/추가/업데이트/삭제 방법 만 사용되도록하려면 어떻게해야합니까?

이 지금까지 내 솔루션입니다 : 나는 또한

UPDATE가 ... 중복 단위 테스트를 만들고 싶어하지 않는 BLL에서

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, 
    } 

내 가져 오기/추가/삭제 방법과 DAL은 얻을 필요한 모든 정보를 가진 UnitDTO 객체.

단 하나의 단점은 -이 프로젝트가 팀에서 수행되는 경우 - UnitDTO를 생성하고 각 CRUD 메소드에 대한 BLL로 전달할 때 어떤 변수가 DAL에서 사용되거나 필요하다는 것을 알아야한다는 것입니다.

당신은 어떻게 생각하십니까?

답변

0

좋아, CRUD 작업을 결합하지 말 것을 제안합니다. Unit을 두 테이블에 저장할 수있는 이유는 무엇입니까? 도메인을 저장하기위한 테이블을 결정하는 규칙이 있어야합니다. 이 "규칙"은 유닛이 하나 이상의 의미/정의/명세를 가질 수 있음을 나타냅니다. 이 사양 중 하나가 변경 될 때 (아마도 추가 열 등), 조건문에 의해 혼란스러워 질 CRUD 연산이 하나만 남게되고, 복잡해질 수 있습니다.

두 단위 사이에 근본적인 차이점이있는 경우 자체 규칙을 사용하여 별도의 비즈니스 개체를 만드는 것이 좋습니다. 디자인을 순수하게 유지하고 별도로 유지하십시오. 예, 코드가 더 많지만 더 간단합니다.

+0

코드가 더 이상 없으면 항상 중복 코드가됩니다. 하나의 testplanUnitService를 변경하면 다른 하나도 변경해야합니다. 두 테이블 모두 동일한 데이터를 저장하지만 차이점은 외래 키입니다. 하나의 단위 테이블은 템플릿의 단위를 저장합니다. 테스트 계획은 템플릿의 모든 유닛을 복사하지만 다른 외래 키로 인해 다른 유닛 테이블에 저장됩니다. – Elisabeth

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; 
      } 
     } 

    } 

처럼 될 수있다, 그들은 그들이 작업하는 장치의 유형을 정확히 알고, 당신은 피할 수 코드 복제. 희망이 도움이됩니다.

+0

DAL을 변경했습니다. 그래서 내 BLL (UnitService)은 여전히 ​​서로 다른 두 개의 테이블에 대해 동일한 메소드를 가지고 있습니다. testplan 단위는 템플릿 단위의 복사/백업이기 때문에 템플릿의 단위는 항상 테스트 계획의 단위와 동일합니다. 그래서 asp.net mvc 컨트롤러 클래스에서 호출 unitService.Insert (단위) 것입니다? – Elisabeth