Pregunta

Cualquiera que use nHibernate con un objeto de dominio & amp; ¿Objeto DTO implementado desde una interfaz común? Estoy tratando de separar todos mis atributos nHibernate en el objeto Dominio, dejando mis DTO y la interfaz limpios.

El problema viene con los errores de lanzamiento de nHibernate cuando intenta asociar las interfaces con las clases concretas.

NHibernate.MappingException: la asociación hace referencia a la clase no asignada: IContact

Entiendo por qué se queja del uso de la interfaz no hibernada, pero me cuesta visualizar una forma de reestructurarla. A continuación se muestra una reproducción esqueleto de mi código, ¿alguna idea de cómo estructurar mejor mi código?

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

Editar:

Deseo tener una interfaz común para asegurarme de que mantienen los mismos campos (es decir, apoyarse en el compilador para mantenerlos consistentes). También me permite usar los DTO en la parte de vista de mi aplicación, pero los convierte en objetos de dominio para el negocio y el acceso a datos. Además, la solución de alex no funciona porque ICompany's Contacts es de tipo IList, no IList. Me gustaría mantenerlo como IContact para que mi objeto DTO no tenga conocimiento del objeto Contact Domain.

¿Fue útil?

Solución

En su caso concreto, simplemente debe agregar Type = typeof (Contact) al atributo de mapeo, así:

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

Otros consejos

Bueno, en su dominio no puede usar IContract para hacer referencia a su entidad de dominio, use la clase Concrete en su lugar. Si desea corregir su versión, simplemente use esto:

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

No veo el punto de interfaz de su dominio y sus DTO. Están acoplados y no pueden tener la misma información. Por ejemplo, podría mantener cierta información encapsulada en su dominio y solo comunicar algunas otras informaciones. Los DTO están diseñados para transferir los datos que desea compartir con las capas superiores.

Puede tener la clase Base para definir su entidad y su ValueObject. En resumen, Entity: DomainEntity tiene capacidad de identificación, lo que significa que pueden persistir. ValueObject = DTO no se puede persistir (no se puede ID)

Observe el diseño central de Sharp-Arch:

  • /BaseObject.cs: proporciona servicios comparativos de objetos básicos.
  • /Entity.cs: proporciona un objeto con un dominio firma y una propiedad de identificación escribible. Esto también tiene la validación Soporte de NHibernate Validator. Objetos que se extienden desde la entidad DEBE tener al menos una propiedad [DomainSignature]; arrojará un Excepción de diseño por contrato si esto se viola. La interfaz IEntityWithTypedID le permite rodar el suyo.
  • /ValueObject.cs: este es un objeto de valor en el que todos sus Las propiedades se utilizan en comparación con otro objeto de valor. Objetos que se extienden desde ValueObject puede no tener ninguna [DomainSignature] propiedades; arrojará una excepción de diseño por contrato si esto es violado

¿Y qué debo hacer si tengo el atributo [HasMany]? En realidad no tiene el nombre de propiedad 'Tipo', pero los de [Propiedad] y [BelongsTo] sí.

UPDATE

La respuesta es usar CollectionType = typeof (YourType)

ACTUALIZACIÓN 2

No, no funciona, esta propiedad está configurada para el tipo de colección, es decir, Lista, etc. Intentando establecer [HasMany (typeof (meType), ...)] pero aún no funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top