私はsirroccoと合意していますが、私はWCFを通してNHibernateエンティティをシリアル化しようとする最も恐ろしい時を過ごしました。
編集:全体のソリューションはここに投稿するには大きすぎる、とofcourseの私のニーズに合わせてカスタマイズされているので、私はいくつかの関連セクション投稿します:あなたはDTOを復活したい場合は、
[DataContract]
public class DataTransferObject
{
private Dictionary<string, object> propertyValues = new Dictionary<string, object>();
private Dictionary<string, object> fieldValues = new Dictionary<string, object>();
private Dictionary<string, object> relatedEntitiesValues = new Dictionary<string, object>();
private Dictionary<string, object> primaryKey = new Dictionary<string, object>();
private Dictionary<string,List<DataTransferObject>> subEntities = new Dictionary<string, List<DataTransferObject>>();
...
public static DataTransferObject ConvertEntityToDTO(object entity,Type transferType)
{
DataTransferObject dto = new DataTransferObject();
string[] typePieces = transferType.AssemblyQualifiedName.Split(',');
dto.AssemblyName = typePieces[1];
dto.TransferType = typePieces[0];
CollectPrimaryKeyOnDTO(dto, entity);
CollectPropertiesOnDTO(dto, entity);
CollectFieldsOnDTO(dto, entity);
CollectSubEntitiesOnDTO(dto, entity);
CollectRelatedEntitiesOnDTO(dto, entity);
return dto;
}
....
private static void CollectPropertiesOnDTO(DataTransferObject dto, object entity)
{
List<PropertyInfo> transferProperties = ReflectionHelper.GetProperties(entity,typeof(PropertyAttribute));
CollectPropertiesBasedOnFields(entity, transferProperties);
foreach (PropertyInfo property in transferProperties)
{
object propertyValue = ReflectionHelper.GetPropertyValue(entity, property.Name);
dto.PropertyValues.Add(property.Name, propertyValue);
}
}
を:WCFサービスは、あなたがIDataContractSurrogate
public class HibernateDataContractSurrogate : IDataContractSurrogate
{
public HibernateDataContractSurrogate()
{
}
public Type GetDataContractType(Type type)
{
// Serialize proxies as the base type
if (typeof(INHibernateProxy).IsAssignableFrom(type))
{
type = type.GetType().BaseType;
}
// Serialize persistent collections as the collection interface type
if (typeof(IPersistentCollection).IsAssignableFrom(type))
{
foreach (Type collInterface in type.GetInterfaces())
{
if (collInterface.IsGenericType)
{
type = collInterface;
break;
}
else if (!collInterface.Equals(typeof(IPersistentCollection)))
{
type = collInterface;
}
}
}
return type;
}
public object GetObjectToSerialize(object obj, Type targetType)
{
// Serialize proxies as the base type
if (obj is INHibernateProxy)
{
// Getting the implementation of the proxy forces an initialization of the proxied object (if not yet initialized)
try
{
var newobject = ((INHibernateProxy)obj).HibernateLazyInitializer.GetImplementation();
obj = newobject;
}
catch (Exception)
{
// Type test = NHibernateProxyHelper.GetClassWithoutInitializingProxy(obj);
obj = null;
}
}
// Serialize persistent collections as the collection interface type
if (obj is IPersistentCollection)
{
IPersistentCollection persistentCollection = (IPersistentCollection)obj;
persistentCollection.ForceInitialization();
//obj = persistentCollection.Entries(); // This returns the "wrapped" collection
obj = persistentCollection.Entries(null); // This returns the "wrapped" collection
}
return obj;
}
public object GetDeserializedObject(object obj, Type targetType)
{
return obj;
}
public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
{
return null;
}
public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
return null;
}
public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
{
}
public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
return null;
}
public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
{
return typeDeclaration;
}
}
Implemenを使用することができ、その場合
private static DTOConversionResults ConvertDTOToEntity(DataTransferObject transferObject,object parent)
{
DTOConversionResults conversionResults = new DTOConversionResults();
object baseEntity = null;
ObjectHandle entity = Activator.CreateInstance(transferObject.AssemblyName,
transferObject.TransferType);
if (entity != null)
{
baseEntity = entity.Unwrap();
conversionResults.Add(UpdatePrimaryKeyValue(transferObject, baseEntity));
conversionResults.Add(UpdateFieldValues(transferObject, baseEntity));
conversionResults.Add(UpdatePropertyValues(transferObject, baseEntity));
conversionResults.Add(UpdateSubEntitiesValues(transferObject, baseEntity));
conversionResults.Add(UpdateRelatedEntitiesValues(transferObject, baseEntity,parent));
....
private static DTOConversionResult UpdatePropertyValues(DataTransferObject transferObject, object entity)
{
DTOConversionResult conversionResult = new DTOConversionResult();
foreach (KeyValuePair<string, object> values in transferObject.PropertyValues)
{
try
{
ReflectionHelper.SetPropertyValue(entity, values.Key, values.Value);
}
catch (Exception ex)
{
string failureReason = "Failed to set property " + values.Key + " value " + values.Value;
conversionResult.Failed = true;
conversionResult.FailureReason = failureReason;
Logger.LogError(failureReason);
Logger.LogError(ExceptionLogger.BuildExceptionLog(ex));
}
}
return conversionResult;
}
小さな例を投稿してください。 –