ずっと前からですが、ここでの問題は、実際には、プロキシをシリアル化する前に初期化されていなかったことだと思います。
NHibernateUtil.Initialize(aPersistentObject.LazyProperty);
プロキシ オブジェクトを初期化するために呼び出す必要があります。
その後、BaseType
おそらく正しかったでしょう...つまり、そうではProxyDummy
なく、実際のタイプが必要でした。
私にとって、解決策は次のようなものです。
namespace com.example.DataAccess
{
public static class Helper
{
// the implementation I use creates a ThreadStatic ISession,
// and then orphans and disposes that ISession when the
// result of this method is disposed.
public static IDisposable GetSession();
public static Type GetUnproxiedType(Type objectType)
{
if (typeof(INhibernateProxy).IsAssignableFrom(objectType))
return objectType.BaseType;
return objectType;
}
public static void Initialize(object proxy)
{
NHibernateUtil.Initialize(proxy);
}
}
}
namespace com.example.WebService
{
internal static class Helper
{
private class ProxyResolver : CamelCasePropertyNamesContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
return base.CreateContract(DataAccess.Helper.GetUnproxiedType(objectType));
}
}
public static readonly JsonSerializer serializer = new JsonSerializer
{
ContractResolver = new ProxyResolver(),
Converters =
{
new StringEnumConverter(),
},
DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat,
Formatting = Formatting.Indented,
// etc.
};
}
}
したがって、プロキシ型の REST サービス エンドポイントがある場合、次のようになります。
[WebGet(UriTemplate= "foo/{id}/bar")]
public Bar GetFooBar(string id)
{
using (DataAccess.Helper.GetSession())
{
var foo = GetFoo(id);
if (foo == null) return null;
DataAccess.Helper.Initialize(foo.Bar);
return foo.Bar;
}
}
で定義されたシリアライザーWebService.Helper
は、結果をシリアライズするために使用されます。
シリアル化プロセスがメソッドの外部で発生する場合 (私の場合のように)、実際にシリアル化する前にオブジェクトを初期化するために常に呼び出す必要があることに注意してください。イベントでこれを行うことができるかもしれませんがGlobal.asax
、サービス メソッドで直接処理するだけです。