2017-09-07 39 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; 
    } 
}  

然而,已經熟悉我自己與數據庫,我意識到「參數」值隱藏了「情況」部分中提出的一些特徵。事實證明,該參數可以由Generic類表示。

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

這個問題對我來說並不明確。如果是關於如何爲現有的數據庫模型創建領域模型,那麼還需要提供數據庫方案。 –

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

然後你就可以對這個列表

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,看起來您將主要使用原始數據類型,因此struct可以成爲一個好候選