Après beaucoup de lecture à propos de Dépôt et de Mapper des Données, j'ai décidé de mettre en œuvre ces modèles dans un projet de test. Depuis que je suis nouveau à cela, je voudrais avoir votre avis sur comment j'ai pu mettre en œuvre ces dans un projet simple.
Jeremy Miller dit :
Faire une sorte de non triviale, personnels de codage projet où vous pouvez expérimenter avec des modèles de conception.
Mais je ne sais pas j'ai fait toutes ces choses bien ou pas.
Voici mon projet de structure :
Comme vous pouvez le voir, il ya de nombreux dossiers dont je vais décrire dans le détail ci-dessous.
-
Domaine : Projet Domaine Entités aller ici, j'ai une simple Personnel de classe qui est héritée de EntityBase classe, EntityBase classe possède une seule propriété nommée Id.
public int Id { get; set; }
-
Infrustructure : Ici est une simple Couche d'Accès aux Données avec deux classes. SqlDataLayer est une simple classe qui hérite d'une classe abstraite nommée DataLayer. Ici je fournir certaines fonctionnalités comme le code suivant :
public SQLDataLayer() { const string connString = "ConnectionString goes here"; _connection = new SqlConnection(connString); _command = _connection.CreateCommand(); }
l'ajout de paramètres aux commandes de paramètre collection :
public override void AddParameter(string key, string value) {
var parameter = _command.CreateParameter();
parameter.Value = value;
parameter.ParameterName = key;
_command.Parameters.Add(parameter);
}
l'exécution de DataReader :
public override IDataReader ExecuteReader() {
if (_connection.State == ConnectionState.Closed)
_connection.Open();
return _command.ExecuteReader();
}
et ainsi de suite.
- Référentiel : Ici, j'ai essayé de mettre en œuvre un modèle de référentiel. IRepository est une interface générique
IRepository.cs :
public interface IRepository<TEntity> where TEntity : EntityBase
{
DataLayer Context { get; }
TEntity FindOne(int id);
ICollection<TEntity> FindAll();
void Delete(TEntity entity);
void Insert(TEntity entity);
void Update(TEntity entity);
}
Référentiel.cs :
public class Repository<TEntity> : IRepository<TEntity> where TEntity : EntityBase, new() {
private readonly DataLayer _domainContext;
private readonly DataMapper<TEntity> _dataMapper;
public Repository(DataLayer domainContext, DataMapper<TEntity> dataMapper) {
_domainContext = domainContext;
_dataMapper = dataMapper;
}
public DataLayer Context {
get { return _domainContext; }
}
public TEntity FindOne(int id)
{
var commandText = AutoCommand.CommandTextBuilder<TEntity>(CommandType.StoredProcedure, MethodType.FindOne);
// Initialize parameter and their types
Context.AddParameter("Id", id.ToString(CultureInfo.InvariantCulture));
Context.SetCommandType(CommandType.StoredProcedure);
Context.SetCommandText(commandText);
var dbReader = Context.ExecuteReader();
return dbReader.Read() ? _dataMapper.Map(dbReader) : null;
}
Je n'ai pas l'exposer pas mis en œuvre des méthodes de IRepository.
Ici au Générique de la classe Repository je m'attends à deux paramètres dans le constructeur de la première est une référence à mon SqlDataLayer classe et le second est une référence à l'Entité DataMapper. Ces paramètres envoyés par chacune des Entités du Référentiel de la classe qui a hérité du Dépôt de la classe. par exemple :
public class PersonnelRepository : Repository<Personnel>, IPersonnelRepository {
public PersonnelRepository(DataLayer domainContext, PersonnelDataMapper dataMapper)
: base(domainContext, dataMapper) {
}
}
Comme vous pouvez le voir ici dans le FindOne méthode que j'ai essayé d'automatiser certaines opérations telles que la création de CommandText, puis j'ai pris le parti de mon DataLayer classe pour configurer la commande et enfin exécuter la commande pour obtenir IDataReader. Je passe IDataReader à mon DataMapper classe à la carte à l'Entité.
-
DomainMapper : Enfin là j'ai la carte résultat de IDataReader à des Entités, le soufflet est un exemple de la façon dont j'ai la carte du Personnel de l'entité :
public class PersonnelDataMapper : DataMapper<Personnel> { public override Personnel Map(IDataRecord record) { return new Personnel { FirstName = record["FirstName"].ToString(), LastName = record["LastName"].ToString(), Address = record["Address"].ToString(), Id = Convert.ToInt32(record["Id"]) }; }}
Utilisation :
using (var context = new SQLDataLayer()) {
_personnelRepository = new PersonnelRepository(context, new PersonnelDataMapper());
var personnel = _personnelRepository.FindOne(1);
}
Je sais que j'ai fait beaucoup d'erreur ici, c'est pourquoi je suis ici. J'ai besoin de vos conseils pour savoir ce que j'ai fait de mal ou ce sont les bons points à ce test simple du projet.
Merci à l'avance.