Question

Quels sont les modèles d'utilisation alternatifs pour Entity Framework?

Certains de ceux que je connais sont:

  1. " Plain " EntityFramework - aka Unité de travail

    using (Data.Model c = new Data.Model())
    {
        var z = c.Users.Where(x=>x.Name=='John');
    }

  2. Modèle de référentiel

    //Model implements IRepository
    User user = Model.Instance.Get<User>(u => u.Name == "John");
    

  3. Quoi d'autre?
  4. ?
Était-ce utile?

La solution

Un bon livre à regarder est le " Modèles d'architecture d'application d'entreprise ".

Là, il passe en revue certains modèles pour extraire / mapper des données telles que les DTO, les unités de travail, les modèles de référentiel, etc. Peut-être que quelque chose pourrait être utile avec Entity Framework. Je devrais y jeter un coup d'œil.

Autres conseils

Je réponds à votre question en partant du principe que vous utilisez Entity Framework directement dans votre interface utilisateur / contrôleur / services.

Il a été prouvé que l’utilisation de tout ORM, y compris EF, directement dans votre interface utilisateur / contrôleurs / services causerait beaucoup de problèmes à l’avenir. De plus, il est si difficile, voire impossible, de tester votre application à l'unité.

La deuxième approche, à savoir "Le modèle implémente le référentiel" est également erroné à mon avis, car Model et Respositories ont des responsabilités différentes et sont basés sur "Single Responsibilty". Dans le cadre des principes SOLID, vous ne devez pas fusionner les deux concepts. Même si vous souhaitez utiliser le motif Objets actifs dans votre modèle, ce que je ne recommande pas, vous devez dissocier votre modèle de l'ORM que vous utilisez.

La meilleure solution et la plus recommandée consiste à avoir une interface comme IRepository ou IRepository avec les membres de base, comme le suggère le modèle. quelque chose comme:

Interface IRepository<T> where T:class
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);

    // if you don't want to return IQueryable
    T FindById(object id);
    IEnumerable FindXXXXX(params)

    // if you prefer to return an IQueryable
    IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}

Notez que certains référentiels ne doivent pas renvoyer IQueryable. De plus, vous pouvez envisager d’utiliser ISpecification au lieu d’expressions et de lambda.

vous auriez besoin de mettre en œuvre une interface IRepositoy pour la plupart de vos entités. En utilisant cette approche, vous pouvez également vous moquer de vos référentiels lorsque vous écrivez des tests unitaires. En production, vous devez utiliser un fournisseur Ioc tel que Unity, Ninject, Linfu, Catsle, etc. Vous pouvez également tirer parti de la mise en œuvre du localisateur de services commun de Microsoft pour éviter le couplage à un framework IoC spécifique.

Auparavant, j’avais une interface d’accès aux données qui était implémentée pour un domaine commercial ou un service spécifique. L’un des problèmes de cette approche est que vous obtiendriez un code en double dans différents services d’accès aux données si vous gardiez une trace de votre code source et vous finirez par le devenir.

Nous utilisons un code similaire à ce que vous avez dans votre exemple d'unité de travail.

En outre, nous mappons des objets sur des objets de transfert de données.

Il existe de nombreux articles sur le sujet, mais la liste sera considérablement réduite si vous en voulez un bon. Cet article de MSDN Magazine est très bon, bien qu’il traite spécifiquement des applications à n niveaux. Mais puisque vous ne dites pas ce que vous construisez, cela aidera peut-être.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top