2017-09-07 9 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

質問は私にとっては明らかではありません。既存の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; 
} 

にデシベルモデルから変換するために、以下を確認してください。そして、あなたがこのリスト

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を制限することができます。基本的には基本的なデータ型を使用しているため、構造体が良い候補になる可能性があります。

関連する問題