Domanda

Qualsiasi utilizzo di nHibernate con un oggetto Domain & amp; Oggetto DTO implementato da un'interfaccia comune? Sto cercando di separare tutti i miei attributi nHibernate nell'oggetto Domain, lasciando puliti i miei DTO e l'interfaccia.

Il problema si presenta con errori di lancio di nHibernate quando si tenta di associare le interfacce alle classi concrete.

NHibernate.MappingException: l'associazione fa riferimento alla classe non mappata: IContact

Capisco perché si lamenta dell'uso dell'interfaccia non ibernata, ma sto lottando per visualizzare un modo per ristrutturarlo. Una riproduzione scheletrica del mio codice è esposta come di seguito, qualche idea su come strutturare meglio il mio codice?

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; } }
}

Modifica:

Voglio avere un'interfaccia comune in modo da poter garantire che mantengano gli stessi campi (ad es. appoggiarsi al compilatore per mantenerli coerenti). Inoltre mi consente di utilizzare i DTO nella parte di visualizzazione della mia applicazione, ma li lancia su oggetti di dominio per l'accesso aziendale e ai dati. Inoltre, la soluzione di alex non funziona perché i contatti di ICompany sono di tipo IList, non IList. Vorrei tenerlo come IContact in modo che il mio oggetto DTO non sia a conoscenza dell'oggetto Contact Domain.

È stato utile?

Soluzione

Nel tuo caso concreto devi solo aggiungere Type = typeof (Contact) all'attributo di mappatura, in questo modo:

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

Altri suggerimenti

Bene nel tuo dominio non puoi usare IContract per fare riferimento alla tua entità di dominio usando invece la classe Concrete. Se vuoi correggere la tua versione usa semplicemente questo:

[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; } }
}

Non vedo il punto di interfacciare il tuo dominio e i tuoi DTO. Sono accoppiati e non possono avere le stesse informazioni. Ad esempio, potresti mantenere alcune informazioni molto ben incapsulate nel tuo dominio e comunicare solo poche altre informazioni. I DTO vengono creati per trasferire i dati che si desidera condividere con i livelli superiori.

Puoi avere una classe Base per definire la tua entità e il tuo ValueObject. In breve Entità: DomainEntity è in grado di identificare l'ID e può essere persistito. ValueObject = DTO non può essere persistito (non ID in grado)

Guarda il design principale di Sharp-Arch:

  • /BaseObject.cs: fornisce servizi comparativi di oggetti di base.
  • /Entity.cs: fornisce un oggetto con un dominio firma e una proprietà ID tipizzabile. Anche questo ha la validazione supporto di NHibernate Validator. Oggetti che si estendono dall'entità DEVE avere almeno una proprietà [DomainSignature]; lancerà a Eccezione per contratto in caso di violazione. L'interfaccia IEntityWithTypedID ti consente di creare il tuo.
  • /ValueObject.cs: questo è un oggetto valore in cui tutti i suoi le proprietà vengono utilizzate rispetto a un altro oggetto valore. Oggetti che si estendono da ValueObject potrebbe non avere alcun [DomainSignature] proprietà; genererà un'eccezione Design-by-Contract se questo è violata.

E cosa devo fare se ho l'attributo [HasMany]? In realtà non ha il nome della proprietà 'Tipo', ma quelli [Proprietà] e [BelongsTo] hanno.

Aggiorna

La risposta è usare CollectionType = typeof (YourType)

AGGIORNAMENTO 2

No, non funziona, questa proprietà è impostata per il tipo di raccolta, ad esempio Elenco ecc. Tentativo di impostare [HasMany (typeof (meType), ...)] ma non funziona ancora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top