В первой (вводной) статье мы обозначили проблему и обсудили что не так она страшна, как кажется
Более подробно теперь остановимся на сериализации NHibernate сущностей. Чтобы в принципе иметь возможность отправлять сущности в общем (generic) виде — нужно динамически поставлять общеизвестные типы тех самых сущностей. Например, имеем контракт:
Чтобы получить все сущности в массив, как видно из контракта, мы должны вызывать метод Read сервиса. Но если у нас иерархия из сущностей:
public class Employee: Entity
//.......
public class Customer: Entity
//.......
Нам нужно воспользоваться волшебным атрибутом ServiceKnownType:
[ServiceContract(Namespace = "http://mynamespace", SessionMode = SessionMode.Allowed)]
[ServiceKnownType("GetKnownTypes", typeof(TypeHelper))]
public interface ISomeContract
{
[OperationContract]
Entity[] Read();
}
public static class TypeHelper
{
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
{
List<Type> result = new List<Type>();
foreach (Type type in typeof(Entity).Assembly.GetExportedTypes())
{
if (type.IsSubclassOf(typeof(Entity)))
{
result.Add(type);
}
}
return result;
}
}
В этом случае мы передадим все необходимые типы, благодаря тому, что на момент вызова GetKnownTypes все используемые известные типы загружены в сборку.
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.