簡體   English   中英

DDD和LookUp表

[英]DDD and LookUp tables

基准條件:

有一個帶有多個固定參數的自行車模型。 除了原始模型參數之外,還應該可以手動添加新模型參數。

情況:

數據庫中的每個參數由以下特征表示:

  • 參數名稱
  • 單位
  • 參數值

數據庫中有幾個查找表。 這些表中的每一個都顯示了可用的度量單位。

在其他參考表中,顯示了參數名稱。

對於每個模型,應顯示參數名稱,其值和度量單位。

問題:

如何最好地實現這種基於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;
    }
}    

但是,在熟悉數據庫之后,我意識到“ Parameter”值隱藏了“ Situation”部分中呈現的許多特征。 事實證明,該參數可以由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模型將采用以下形式:

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

但是如何使用查找表來編譯這樣的參數?

你能行的。 只需在集合中使用存儲庫模式即可。 請檢查以下內容,以將數據庫模型轉換為您的域模型

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的位置添加where T: struct來限制T,似乎您將主要使用原始數據類型,因此struct可能是一個不錯的選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM