[英]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.