Assumer le Poços simple suivant, Pays et État:POCO de référentiel à niveaux multiples - Agrégats?
public partial class Country
{
public Country()
{
States = new List<State>();
}
public virtual int CountryId { get; set; }
public virtual string Name { get; set; }
public virtual string CountryCode { get; set; }
public virtual ICollection<State> States { get; set; }
}
public partial class State
{
public virtual int StateId { get; set; }
public virtual int CountryId { get; set; }
public virtual Country Country { get; set; }
public virtual string Name { get; set; }
public virtual string Abbreviation { get; set; }
}
Supposons maintenant je simple respository qui ressemble à ceci:
public partial class CountryRepository : IDisposable
{
protected internal IDatabase _db;
public CountryRepository()
{
_db = new Database(System.Configuration.ConfigurationManager.AppSettings["DbConnName"]);
}
public IEnumerable<Country> GetAll()
{
return _db.Query<Country>("SELECT * FROM Countries ORDER BY Name", null);
}
public Country Get(object id)
{
return _db.SingleById(id);
}
public void Add(Country c)
{
_db.Insert(c);
}
/* ...And So On... */
}
Généralement dans mon interface utilisateur, je n'affiche pas tous les enfants (états), mais je montre un compte agrégé. Donc, mon modèle de vue sur la liste des pays pourrait ressembler à ceci:
public partial class CountryListVM
{
[Key]
public int CountryId { get; set; }
public string Name { get; set; }
public string CountryCode { get; set; }
public int StateCount { get; set; }
}
Lorsque j'utilise le fournisseur de données sous-jacentes (Entity Framework, NHibernate, PetaPoco, etc.) directement dans ma couche d'interface utilisateur, je peux facilement faire quelque chose comme ça :
IList<CountryListVM> list = db.Countries
.OrderBy(c => c.Name)
.Select(c => new CountryListVM() {
CountryId = c.CountryId,
Name = c.Name,
CountryCode = c.CountryCode,
StateCount = c.States.Count
})
.ToList();
Mais lorsque j'utilise un référentiel ou un modèle de service, je supprime l'accès direct à la couche de données. Il semble que mes options sont:
Retour le pays avec une collection États peuplés, carte puis sur la couche d'interface utilisateur. L'inconvénient de cette approche est que je retourne beaucoup plus de données que nécessaire.
-ou-
Mettez tous mes modèles de vue dans ma bibliothèque dll commune (par opposition à les avoir dans le répertoire des modèles dans mon application MVC) et d'élargir mon répertoire pour retourner des modèles de vue spécifiques au lieu de simplement la pocos de domaine. L'inconvénient de cette approche est que je fuis des éléments spécifiques à l'interface utilisateur (annotations de validation de données MVC) dans mes POCO précédemment nettoyés.
-ou-
Y at-il d'autres options?
Comment gérez-vous ce genre de choses?
Dans votre deuxième approche, cela ne mène-t-il pas à n + 1 (une sélection pour obtenir la liste des pays, puis une sélection pour chaque pays)? – Sam
Oui, il émettra une requête de compte pour chaque pays. Si vous avez beaucoup de pays, ce n'est pas une bonne solution. – Vladikk