さて、現時点で問題があります。これは、AutoMapper、NHibernateクエリ、またはドメイン/DTO設計のいずれかにあります。
私が抱えている問題は、フェッチを実行すると、たとえばObjectAにはObjectBのリストが含まれ、ObjectBにはその親ObjectAのプロパティがあることです。ObjectAのObjectBプロパティを熱心にフェッチするクエリがある場合、ABAbABABなどを無限に続けることができます。
これは、ドメインオブジェクトを同じ取引を含むDTOAにマップしようとすると、DTOAにはDTOBのリストがあり、DTOBにはその親DTOAのプロパティがあることを意味します。AutoMapperを使用してDomainAをDTOAにマップしていると思われるため、またDTOA.DTOB.DTOA.DTOBなどが無限にシリアル化されているため、これを返すときにサービスがタイムアウトします。
とにかく、私が確信していることに対する最善の解決策は、古くからの古典的な問題ですが、私は私の古い友人のグーグルに入力するための正しいものを見つけるのに苦労しています。AutoMapperに子の親インスタンスを無視させることはできますか?できれば、Nhibernateにリストをフェッチさせても、親プロパティにプロキシを保持させることができればと思います。最悪の解決策は、特定のシナリオまたは特殊なロジックのオブジェクトを使用したドメインオブジェクトの変更です。
どんな助けでも感謝します。
編集-コード
マッピングコード
Mapper.CreateMap<DTOA, DomainA>();
Mapper.CreateMap<DomainA, DTOA>()
.ForMember(dst => dst.AProperty,
opts =>
opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty));
ドメインオブジェクトDomainA
/// <summary>
/// Data Transfer Object, object representing a user
/// </summary>
public class DomainA
{
/// <summary>
/// Gets or sets the clans.
/// </summary>
/// <value>The clans.</value>
public virtual IList<DomainB> AProperty{ get; set; }
}
ドメインオブジェクトDomainB
/// <summary>
/// DTO for clan members
/// </summary>
public class DomainB
{
/// <summary>
/// Gets or sets the ID.
/// </summary>
/// <value>The ID.</value>
public virtual int ID { get; set; }
/// <summary>
/// Gets or sets the user.
/// </summary>
/// <value>The user.</value>
public virtual DomainA BProperty{ get; set; }
}
Nhibernateクエリ
return session.QueryOver<DomainA>()
.Where(a => a.ID == id)
.Fetch(a=> a.AProperty).Eager
.List<DomainA>().FirstOrDefault();
WCFサービスのreturnステートメント
return AutoMapper.Map<DomainA, DTOA>(returnedDomainA);
フェッチを使用してクエリを実行し、dtoドメイン構造と自動マッパー構成を実行すると、サービスがエラーなしでタイムアウトします。シリアル化を試み、フェッチとリストがnullになることなく、無限にループしていると思いますが、もちろんすべて正常に機能します。