2017-09-07 1 views
0

conditions de base:tables DDD et Lookup

Il y a un modèle de vélo avec un certain nombre de paramètres fixes. En plus des paramètres du modèle d'origine, il devrait être possible d'ajouter manuellement de nouveaux paramètres de modèle.

Situation:

Chaque paramètre dans la base de données est représenté par les caractéristiques suivantes:

  • Nom du paramètre
  • Unités
  • Valeur du paramètre

Il y a plusieurs Tables de recherche dans le base de données. Chacun de ces tableaux montre les unités de mesure disponibles.

Dans d'autres tableaux de référence, les noms des paramètres sont présentés.

Le nom du paramètre, sa valeur et ses unités de mesure doivent être affichés pour chaque modèle.

Questions:

La meilleure façon de mettre en œuvre une telle approche basée sur DDD? Je ne veux pas compliquer le modèle de domaine en faisant glisser l'approche utilisée dans la base de données, ce qui ne devrait pas du tout affecter le modèle.

Notes:

Dans un premier temps, avant de lire la base de données, je considère que les paramètres du modèle doivent être représentés par un ensemble de propriétés, par exemple:

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

Cependant, après avoir pris connaissance moi-même avec la base de données, j'ai réalisé que la valeur "Paramètre" cache un certain nombre de caractéristiques présentées dans la section "Situation". Il s'avère que le paramètre peut être représenté par la classe 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; 
    } 
} 

Dans ce cas, le modèle de vélo prendra la forme suivante:

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

Mais comment compiler un tel paramètre à l'aide des tables de consultation?

+1

La question n'est pas claire pour moi. S'il s'agit de créer un modèle de domaine pour votre modèle de base de données existant, fournissez également un schéma de base de données. –

+0

Création d'un modèle de domaine de domaine, j'ai tendance à abstraire au maximum de la base de données existante en utilisant le référentiel. Cependant, je ne comprends pas très bien comment vous pouvez faire abstraction de la base de données dans les conditions existantes. – Eladei

Répondre

0

Vous pouvez le faire. Utilisez simplement le modèle de référentiel dans votre agrégat. S'il vous plaît vérifier ci-dessous pour convertir le modèle db à votre modèle de domaine

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

Et vous pouvez cette liste pour

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

Vous pouvez ajouter une méthode d'extension pour améliorer la lisibilité.

Cependant, je pense qu'il y a quelques problèmes sur la façon dont vous concevez votre application.Je ne vois pas l'intérêt d'utiliser un ensemble privé comme vous essayez d'obtenir l'immuabilité. Vous pouvez restreindre le T en ajoutant where T: struct, il semble que vous utiliserez principalement des types de données primitifs afin struct peut être un bon candidat