문제

공통 인터페이스에서 구현 된 도메인 객체 및 DTO 객체와 함께 nhibernate를 사용합니까? 나는 모든 nhibernate 속성을 도메인 객체로 분리하려고 노력하여 DTO와 인터페이스를 깨끗하게 남겨두고 있습니다.

문제는 인터페이스를 콘크리트 클래스와 연관 시키려고 할 때 nhibernate 던지기 오류와 함께 제공됩니다.

nhibernate.mappingexception : 협회 참조 미개발 클래스 : iContact

비 정화 인터페이스의 사용에 대해 불평하는 이유를 이해하지만 주변을 재구성하는 방법을 시각화하기 위해 고군분투하고 있습니다. 내 코드의 골격 재생산은 아래와 같이 명시되어 있으며, 내 코드를 더 잘 구성하는 방법에 대한 아이디어가 있습니까?

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

편집하다:

나는 그들이 동일한 필드를 유지할 수 있도록 공통 인터페이스를 원한다 (즉, 컴파일러에 기대어 일관성을 유지하기 위해). 또한 응용 프로그램의보기 부분에서 DTO를 사용할 수 있지만 비즈니스 및 데이터 액세스를 위해 도메인 객체로 캐스트합니다. 또한 Alex의 솔루션은 Icompany의 연락처가 Ilist가 아닌 유형의 Ilist이기 때문에 작동하지 않습니다. DTO 객체가 접촉 도메인 객체에 대한 지식이 없도록 ICONTACT로 유지하고 싶습니다.

도움이 되었습니까?

해결책

콘크리트 케이스에서는 추가해야합니다 Type = typeof(Contact) 마찬가지로 매핑 속성에 :

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

다른 팁

도메인에서는 아이콘을 사용하여 도메인 엔티티를 참조 할 수 없습니다. 대신 콘크리트 클래스를 사용합니다. 버전을 수정하려면 간단히 사용하십시오.

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

도메인과 DTO를 인터페이스 할 포인트가 보이지 않습니다. 그들은 결합되어 있으며 같은 정보를 가질 수 없습니다. 예를 들어, 일부 정보를 도메인에 캡슐화하고 다른 정보를 소송 할 수 있습니다. DTO는 Up-Layers와 공유하려는 데이터를 전송하도록 만들어졌습니다.

엔티티와 valueObject를 정의하기 위해 기본 클래스를 가질 수 있습니다. 간단한 엔티티에서 : Domainentity는 ID가 가능하다는 의미입니다. valueObject = dto는 지속될 수 없습니다 (ID 가능하지 않음)

Sharp-Arch의 핵심 디자인을보십시오.

  • /baseobject.cs : 기본 객체 비교 서비스를 제공합니다.
  • /entity.cs : 도메인 서명 및 유형화 가능한 ID 속성이있는 개체를 제공합니다. 이것은 또한 nhibernate 유효성 검사기의 검증 지원이 있습니다. 엔티티에서 연장되는 개체는 하나 이상의 [DomainsIgnature] 속성을 가져야합니다. 위반되면 계정별로 설계 예외를 던집니다. 인터페이스 ientitywithtypedid를 사용하면 자신의 것을 굴릴 수 있습니다.
  • /valueobject.cs : 이것은 다른 값 객체와 비교할 때 모든 속성이 사용되는 값 객체입니다. valueObject에서 확장되는 개체는 [DomainsIgnature] 속성이 없을 수 있습니다. 위반되면 계정별로 설계 예외를 던집니다.

Hasmany] 속성이 있다면 어떻게해야합니까? 실제로는 속성 이름 '유형'이 아니지만 [속성]과 [속성]은 가지고 있습니다.

업데이트

대답은 사용하는 것입니다 CollectionType = typeof(YourType)

업데이트 2

아니요, 작동하지 않습니다.이 속성은 수집 유형 IE 목록 등으로 설정되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top