Programmation d'interfaces tandis que la cartographie avec NHibernate Fluent

J'ai été fouettée à la soumission et ont commencé à apprendre à parler Couramment NHibernate (pas de précédent NHibernate de l'expérience). Dans mon projet, je suis à la programmation d'interfaces pour réduire le couplage etc. Que signifie à peu près "tout" fait référence à l'interface plutôt que sur le béton type (IMessage au lieu de Message). La pensée derrière c'est pour aider à la rendre plus testable en étant capable de se moquer de dépendances.

Cependant, (Courant) NHibernate n'aime pas quand j'essaie de la carte d'interfaces au lieu de classes concrètes. La question est simple: en fonction de la fluidité de la Wiki, il est intelligent pour définir le champ ID de ma classe comme par exemple

int Id { get; private set; }

pour obtenir un typique auto-généré de clé primaire. Toutefois, cela ne fonctionne qu'avec les classes de béton - je ne peux pas spécifier un niveau d'accès sur une interface, où la même ligne doit être

int Id { get; set; }

et je pense qu'il nie faire le setter privé dans la classe concrète (l'idée que seule la NHibernate devrait jamais de définir l'IDENTIFIANT attribué par l'DB).

Pour l'instant, je pense que je vais juste faire le setter public et éviter la tentation de l'écriture pour elle.. Mais quelqu'un aurait-il une idée de ce que serait le "bon", les meilleures pratiques pour créer un bon de clé primaire domaine que seulement NHibernate peut écrire pour tout encore que la programmation d'interfaces?

Mis à JOUR

De ce que je comprends après les deux réponses ci-dessous à partir de mookid et James Gregory, je peut très bien être sur la mauvaise voie - là ne devrait pas être une raison pour moi d'avoir une interface par entité comme je l'ai maintenant. C'est bien et bon. Je suppose que ma question devient alors - n'est-il pas raison à 100% contre une interface pour toutes les entités? Et si il n'y a même pas une seule situation où il pourrait être justifié, est-il possible de faire cela avec (Courant) NHibernate?

Je demande parce que je ne sais pas, de ne pas être critique. Merci pour les réponses. 🙂

  • C'est drôle parce que certains développeurs respect j'ai accidentellement pris sur l'entité de l'interface de l'anti-modèle. C'est plus une erreur que les pros font, que les novices, car les recrues à peine de savoir pourquoi les interfaces sont important en premier lieu.
  • Si vous n'êtes pas la création d'interfaces pour vos entités, alors comment voulez-vous tester le comportement de votre entités? Plus précisément, comment vous vous moquez des dépendances de cette entité?
  • Quand les gens disent à programmer des interfaces pas implémentations ils ne signifient pas la langue de l'interface de construire. Ils signifient essayer de boîte noire le code que vous utilisez autant que possible. I. e. Lors de l'utilisation d'un agent Recenseur sur un dictionnaire ne présumez pas de Courant ne lèvera pas avant movenext est appelée qu'il n'est pas défini et peut changer.
  • J'ai pensé à cette approche moi - même- à l'aide des interfaces pouvait m'apporter une solution facile de la zone de l'abstraction de mes objets de données. Malheureusement, comme vous pouvez accidentellement mis un ID à une mise en œuvre de toute entité de l'interface, vous avez la chose que vous voulez éviter de), vous (ou quelqu'un de consommer votre code) peut accidentellement créer une classe de mise en œuvre de plus d'une entité de l'interface. Je crois que le mettre dans un sacré désordre. Personnellement, je préfère utiliser les classes abstraites à la place.
  • si votre entités sont simples POCOs, détaché de l'ORM attributs spécifiques/comportement (c'est à dire à l'aide d'attributs de descripteurs), alors rien ne vous arrête de directement utiliser dans vos scénarios de test. J'ai l'impression que ce n'est plus une pratique moderne de couple à une entité de l'ORM de mise en œuvre. Si, toutefois, vous êtes à l'aide de Microsoft Cadre de l'Entité et l'Entité de base de la classe, par exemple, ou d'avoir "hérité" d'un projet avec déjà couplée à des entités à l'ORM de fonctionnalités spécifiques, compte tenu de l'entité abstraction est raisonnable.