Question

Toute personne utilisant nHibernate avec un objet Domain & amp; Objet DTO implémenté à partir d'une interface commune? J'essaie de séparer tous mes attributs nHibernate dans l'objet Domain, tout en laissant mes interfaces DTO et mon interface propres.

Le problème vient du fait que nHibernate a généré des erreurs lorsqu’il essaie d’associer les interfaces aux classes concrètes.

NHibernate.MappingException: l'association fait référence à la classe non mappée: IContact

Je comprends pourquoi il se plaint de l’utilisation de l’interface non hibernée, mais j’ai du mal à trouver un moyen de se restructurer. Une reproduction squelettique de mon code est présentée ci-dessous. Avez-vous des idées pour mieux structurer mon code?

public interface ICompany
{
    IList<IContact> Contacts { get; set; }
}

public class CompanyDTO : ICompany
{
    private IList<IContact> contacts;
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }

}

[ActiveRecord]
public class Company : ActiveRecordBase<Company>, ICompany
{
    private IList<IContact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Modifier:

Je souhaite disposer d'une interface commune pour pouvoir m'assurer qu'ils conservent les mêmes champs (c'est-à-dire qu'ils s'appuient sur le compilateur pour les maintenir cohérents). Cela me permet également d'utiliser les DTO dans la partie d'affichage de mon application, mais les convertit en objets de domaine pour l'accès aux entreprises et aux données. De plus, la solution alex ne fonctionne pas car les contacts de ICompany sont de type IList, et non IList. Je souhaite le conserver en tant que IContact afin que mon objet DTO ne connaisse pas l'objet Contact Domain.

Était-ce utile?

La solution

Dans votre cas concret, vous devriez simplement ajouter Type = typeof (Contact) à l'attribut de mappage, comme suit:

[HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]

Autres conseils

Dans votre domaine, vous ne pouvez pas utiliser IContract pour faire référence à votre entité de domaine, utilisez plutôt la classe Concrete. Si vous souhaitez corriger votre version, utilisez simplement ceci:

[ActiveRecord]
public class Company : ActiveRecordBase<Company>
{
    private IList<Contact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<Contact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Je ne vois pas l'intérêt d'interfacer votre domaine et vos DTO. Ils sont couplés et ils peuvent ne pas avoir les mêmes informations. Par exemple, vous pouvez garder certaines informations très bien encapsulées dans votre domaine et ne communiquer que quelques autres informations. Les DTO sont conçus pour transférer les données que vous souhaitez partager avec les couches supérieures.

Vous pouvez avoir la classe de base pour définir votre entité et votre ValueObject. En bref Entity: DomainEntity sont des identifiants signifiant, ils peuvent être persistés. ValueObject = DTO ne peut pas être persisté (non identifiable)

Regardez la conception de base de Sharp-Arch:

  • /BaseObject.cs: fournit des services de comparaison d’objets de base.
  • /Entity.cs: fournit un objet avec un domaine signature et une propriété ID typable. Cela a aussi la validation support de NHibernate Validator. Objets qui s'étendent d'une entité DOIT avoir au moins une propriété [DomainSignature]; ça va jeter un Exception de conception par contrat en cas de violation. L'interface IEntityWithTypedID vous permet de lancer le vôtre.
  • /ValueObject.cs: C’est un objet de valeur dans lequel toutes ses les propriétés sont utilisées par rapport à un autre objet de valeur. Objets qui s’étendent de ValueObject ne peuvent pas avoir de [DomainSignature] Propriétés; ça va jeter une exception Design-By-Contract si cela est violé.

Et que dois-je faire si j'ai l'attribut [HasMany]? En fait, il ne porte pas le nom de propriété 'Type', mais les propriétés [Propriété] et [Appartient à] ont.

MISE À JOUR

La solution consiste à utiliser CollectionType = typeof (VotreType)

.

UPDATE 2

Non, cela ne fonctionne pas, cette propriété est définie pour le type de collection i.e. List etc. Essayer de définir [HasMany (typeof (meType), ...)] mais ne fonctionne toujours pas.

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