2017-09-07 1 views
0

기준 조건 :DDD 및 룩업 테이블

고정 매개 변수와 함께 자전거 모델이있다. 원래 모델 매개 변수 외에도 새 모델 매개 변수를 수동으로 추가 할 수 있어야합니다.

상황 : 데이터베이스의 각 매개 변수는 다음과 같은 특성에 의해 표현된다

:

  • 매개 변수 이름
  • 단위
  • 파라미터 값

은 여러 가지가 있습니다 조회 테이블 데이터 베이스. 각 표에는 사용 가능한 측정 단위가 나와 있습니다.

다른 참조 표에는 매개 변수 이름이 나와 있습니다.

매개 변수의 이름, 값 및 측정 단위가 각 모델에 표시되어야합니다.

질문 :

이 최선의 방법 DDD 기반으로 이러한 접근 방식을 구현하는 방법? 데이터베이스에 사용 된 접근 방식을 끌어 도메인 모델을 복잡하게 만들고 싶지는 않습니다. 모델에 전혀 영향을 미치지 않아야합니다.

주 : 익숙하게 한, 그러나

// Bike model 
public class BikeModel { 
    public BikeModel(string name, double height, double width) { 
     ChangeName(name); 
     ChangeHeight(height); 
     ChangeWidth(width); 
    } 


    // Bike model name 
    public string Name { get; private set; } 

    // Bike height 
    public double Height { get; private set; } 

    // Bike width 
    public double Width { get; private } 


    public void ChangeName(string name) { 
     Name = name; 
    } 

    public void ChangeHeight(double height) { 
     Height = height; 
    } 

    public void ChangeWidth(double width) { 
     Width = width; 
    } 
}  

: 처음

, 데이터베이스를 읽기 전에, 나는 예를 들어, 모델의 매개 변수는 속성 집합으로 표현되어야한다고 생각 나 자신이 데이터베이스와 함께, "매개 변수"값이 "상황"섹션에 제시된 많은 특성을 숨 깁니다. 매개 변수는 일반 클래스로 나타낼 수 있습니다. 이 경우

public class ParameterOfModel<T> { 
    public ParameterOfModel(string name, T value, string units) { 
     SetName(name); 
     SetValue(value); 
     SetUnits(units); 
    } 

    // Parameter name 
    public string Name { get; private set; } 

    // Parameter value 
    public T Value { get; private set; } 

    // Units of the parameter 
    public string Units { get; private set; } 


    public void SetName(string name) { 
     Name = name; 
    } 

    public void SetValue(T value) { 
     Value = value; 
    } 

    public void SetUnits(string units) { 
     Units = units; 
    } 
} 

, 다음과 같은 형식 소요됩니다 자전거 모델 :

// Bike model class 
public class BikeModel { 
    public BikeModel(string name, double height, double width) { 
     ChangeName(name); 
     ChangeHeight(height); 
     ChangeWidth(width); 

     AdditionalNumericParams = new List<ParameterOfModel<double>>(); 
    } 


    // Bike model name 
    public string Name { get; private set; } 

    // Bike height 
    public ParameterOfModel<double> Height { get; private set; } 

    // Bike width 
    public ParameterOfModel<double> Width { get; private set; } 

    // Additional numeric parameters 
    public List<ParameterOfModel<double>> AdditionalNumericParams { get; private set; } 


    public void ChangeName(string name) { 
     Name = name; 
    } 

    public void ChangeHeight(double height) { 
     Height = new ParameterOfModel<double>("Bike height", height, "Centimeters"); 
    } 

    public void ChangeWidth(double width) { 
     Width = new ParameterOfModel<double>("Bike height", width, "Centimeters"); 
    } 

    // Add an additional parameter to the model 
    public void AddNewNumericParam(ParameterOfModel<double> additionalParameter) { 
     AdditionalNumericParams.Add(additionalParameter); 
    } 
} 

그러나 방법은 룩업 테이블을 사용하여 이러한 매개 변수를 컴파일을?

+1

질문이 명확하지 않습니다. 기존 DB 모델의 도메인 모델을 만드는 방법에 관한 것뿐 아니라 DB 스키마도 제공하는 것입니다. –

+0

도메인 도메인 모델을 만들 때 저장소를 사용하여 기존 데이터베이스에서 최대한 추상화하는 경향이 있습니다. 그러나, 나는 당신이 기존 조건 하에서 데이터베이스로부터 어떻게 추상화 할 수 있는지 잘 이해하지 못한다. – Eladei

답변

0

할 수 있습니다. 집계에서 저장소 패턴을 사용하기 만하면됩니다. 도메인 모델

public static BikeModel ConvertToModel(BikeTable dbTable) 
{ 
    var bikeModel = 
     new BikeModel(dbTable.Name, dbTable.Height, dbTable.Width); 

    if (dbTable.AdditionalProps != null) 
    { 
     bikeModel.AddNewNumericParam(dbTable.AdditionalNumericParams); 
    } 

    return tenantEntity; 
} 

에 DB 모델 변환 아래 확인하시기 바랍니다 그리고 당신이 목록

private static IEnumerable<BikeModel> ConvertToModel(IEnumerable<BikeTable> enumerable) 
{ 
    return enumerable.Select(ConvertToModel); 
} 

public async Task<IEnumerable<TenantEntity>> Find(string term) 
{  
    var lst = await _bikeRepository.GetAllAsync(); 

    return ConvertToModel(lst); 
} 

당신은 가독성을 향상시킬 수있는 확장 메서드를 추가 할 수 있습니다.

그러나 응용 프로그램을 디자인하는 방식에는 몇 가지 문제가 있다고 생각합니다.당신이 불변성을 얻으려고 노력할 때 프라이빗 세트를 사용함에 대한 어떤 가치도 발견 할 수 없습니다. where T: struct을 추가하여 T를 제한 할 수 있습니다. 기본 데이터 형식을 주로 사용하므로 구조체가 좋은 후보가 될 수 있습니다.