Pergunta

Qualquer usando nHibernate com um objeto Domínio & objeto DTO implementado a partir de uma interface comum? Estou tentando separar toda a minha nHibernate atributos no objeto de domínio, deixando minha DTO e interface limpa.

O problema vem com nHibernate jogando erros quando ele tenta associar as interfaces com as classes concretas.

NHibernate.MappingException: referências associação de classe não mapeada: IContact

Eu entendo por que a sua queixa sobre a utilização da interface não-hibernado, mas eu estou lutando para forma um visual para reestruturar em torno dele. Uma reprodução esqueleto do meu código é definido como abaixo, todas as idéias sobre como estruturar meu código melhor?

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:

Eu quero ter uma interface comum para que eu possa garantir que eles estão mantendo os mesmos campos (ie. Inclinando-se sobre o compilador para mantê-los consistentes). Ele também me permite usar o DTO na vista parte da minha aplicação, mas lança-los para objetos de domínio para negócios e acesso a dados. Além disso, a solução de alex não funciona porque de ICompany Contactos é do tipo IList, não IList. Eu gostaria de mantê-lo como IContact assim meu objeto DTO não tem conhecimento do objeto de contato do domínio.

Foi útil?

Solução

No seu caso concreto, você deve apenas adicionar Type = typeof(Contact) ao atributo de mapeamento, assim:

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

Outras dicas

Bem no seu domínio que você não pode usar o IContract a referência ao seu domínio uso entidade de classe de concreto em vez. Se você quiser corrigir seu uso versão simplesmente esta:

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

Não vejo o ponto de interface seu domínio e seus DTOs. Eles são acoplados, e eles podem não têm as mesmas informações. Por exemplo, você poderia manter algumas informações muito weel encapsulado em seu domínio e apenas comunicar algumas outras informações. DTO são feitas para Transfert os dados que deseja compartilhar com up-camadas.

Você pode ter classe base para definir a sua entidade e seu ValueObject. Em breve Entidade: DomainEntity são meios de identificação capaz eles podem ser persistentes. ValueObject = DTO não pode ser persistentes (não ID capazes)

Olhe para o projeto do núcleo de Sharp-Arch:

  • /BaseObject.cs:. Fornece serviços comparativos objeto básico
  • /Entity.cs: Fornece um objeto com um domínio assinatura e uma propriedade ID tipável. Isso também tem a validação apoio do NHibernate validador. Objetos que se estendem da Entidade Deve ter pelo menos um [DomainSignature] propriedade; ele vai jogar um Projetar a contrato exceção se esta for violada. A interface IEntityWithTypedID permite que você rolar o seu próprio.
  • /ValueObject.cs: Este é um objeto de valor na qual toda a sua propriedades são usados ??quando comparado com um outro objeto valor. objetos que se estendem a partir de ValueObject pode não ter qualquer [DomainSignature] propriedades; ele vai lançar uma exceção Design-by-Contract se isso é violados.

E o que devo fazer se eu tiver atributo [HasMany]? Ele realmente não tem nome da propriedade 'Tipo', mas [propriedade] e [Pertence] os ter.

Atualizar

A resposta é usar CollectionType = typeof(YourType)

UPDATE 2

Não, Ele não trabalha, essa propriedade é definida para o tipo de coleção ou seja Lista etc. Tentando set [HasMany (typeof (meType), ...)], mas ainda não funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top