12
votes

Est-ce que j'utilise l'irréparateur correctement?

Je cherche à utiliser le motif de l'irréprochage (soutenu par NHibernate, si cela compte) dans un petit projet. Le domaine est simple, intentionnellement, afin de me permettre de vous concentrer sur la compréhension du motif de l'irréprochage. La classe de domaine isolée est Film CODE>, avec Propriétés de Année CODE>, Genre code> et Titre code>. Mon intention serait de "obtenir" des films dont les propriétés correspondent aux critères des types susmentionnés.

Convention semble être d'avoir une interface générique IRÉPOSITOIRE CODE>, similaire aux éléments suivants: P>

public class MovieRepository : Repository<Movie>, IMovieRepository
{
    public Movie[] GetByGenre(Genre genre) { ... }
    public Movie[] GetByYear(int year) { ... }
    public Movie[] GetByTitle(string title) { ... }
}


0 commentaires

3 Réponses :


6
votes
  1. Essayez de ne pas transmettre un tableau . Utilisez iEnumerable , icollection ou ilist , cela couplera de manière lâche votre code supplémentaire. < / li>

  2. votre interface imovierePositoire. Ce référentiel comprend le crud. donc le faire

    iMovierepository: IRÉPOSITOIRE {}

    Ceci ne changera pas votre classe MOVIEREEPOSITIONNE CLASSE COMMENT Mettre en œuvre l'interface correctement. Cela vous permettra de découpler vos classes si vous souhaitez modifier la mise en œuvre à une date ultérieure.

    Enfin. C'est bien pour l'une des méthodes. Comme vous avez des fonctionnalités spécialisées, vous avez spécialisé le référentiel en fonction.

    Il existe d'autres moyens, ce qui vous permet d'utiliser 1 classe de la réfposition et de passer dans la requête requise. Ceci s'appelle le modèle de spécification. J'ai fait un projet qui l'utilise sur CodePlex avec rapport http://whiteboardchat.codeplex.com

    L'autre moyen d'avoir une méthode pour réussir les critères. Il y a un projet open source appelé Architecture Sharp, ce qui, à ma croire, a cette codée.

    J'espère que cela aide


1 commentaires

Merci pour les pointeurs sur la mise en œuvre des schémas de spécification et les méthodes fondées sur les critères. Les deux sont des idées intéressantes et je les serai plus proches, bien que maintenant je garde des choses simples et simples.



2
votes

Je dirais que vous diriez que vous êtes proche du référentiel que j'utilise dans une solution de production pour la planification des ressources dans les sociétés de transport (à l'aide de NHibernate également) - afin de commencer à commencer sur le bon chemin à mon avis. Je suis d'accord avec Dbones sur utiliser ienumerables / IList au lieu de tableaux - vous finirez par écrire .totarray () plusieurs fois sur: -).

Quelques choses que vous pourriez envisager: P>

Favoriser la composition sur Héritage - au lieu d'hériter du référentiel abstrait - qu'il soit non pas abstrait et de l'injecter dans le CTOR et déléguez les appels - cela rend votre conception plus robuste dans certaines situations (par exemple, pour un référentiel de requêtes, etc.) de cette façon Vous avez également la possibilité de laisser le référentiel abstrait être instantané (est-ce un mot?) et contrôler s'il devrait être partagé sur tous les référentiels. P>

Suivi de ce point - vous voudrez peut-être changer la base Référentiel à avoir des méthodes génériques au lieu d'hériter de l'interface générique: p> xxx pré>

Vous voudrez peut-être laisser les référentiels spécifiques ayant accès à l'isession - cela améliore considérablement la flexibilité que vous pouvez faire vos requêtes et contrôler la récupération désireuse / paresseuse et vous bénéficiez pleinement de NHibernate, etc. Par exemple, P>

public class MovieRepository : IMovieRepository
{
    private Repository _repository;
    public MovieRepository(Repository repository)
    {
        _repository = repository;
    }
    public IList<Movie> GetByYear(int year)
    {
        Func<ISession, IList<Movie> query = session =>
        {
            var query = session.CreateQuery("from Movie"); //or
            var query = session.CreateCriteria("from Movie"); //or
            var query = session.Linq<Movie>();
            //set criteria etc.
            return query.List<Movie>(); //ToList<Movie>() if you're using Linq2NHibernate
        }:
        return _repository.WrapQueryInSession(query);
    }
}


4 commentaires

J'aime votre suggestion sur l'utilisation d'un référentiel non abstraite pour gérer le travail de type CRUD de bas niveau commun, délégué des repos spécifiques. Il augmente la question d'obtenir un isession dans le repo générique et le repo spécifique en l'utilisant.


L'isession doit être obtenue via une Isession privée dans le référentiel. Le référentiel spécifique utilise ensuite une méthode de larpexxxxexinsession du référentiel générique.


Ah oui, cela aide. J'aime tout à fait l'idée générale ... Un autre avantage est que le reposager injecté peut être moqué pour des tests. Il y aura le truc de la construction et de la transmission d'objets dans le bon ordre, mais un outil de CIO peut probablement gérer cela.


Il peut - j'ai utilisé à la fois un modèle de servicelocator ainsi qu'un conteneur CIO pour aider dans ce département.



0
votes

comme nourriture à réflexion, si votre orme de choix a un fournisseur LINQ (et NH en a une), vous pouvez essayer le référentiel requérissant qui est assez similaire à une collection:

public interface IRepository<T> : ICollection<T>, IQueryable<T>


0 commentaires