NHibernate и WCF. Часть 2. Динамически подставляем известные типы



В первой (вводной) статье netcoder.ru/blog/csharp/224.html мы обозначили проблему и обсудили что не так она страшна, как кажется

Более подробно теперь остановимся на сериализации NHibernate сущностей. Чтобы в принципе иметь возможность отправлять сущности в общем (generic) виде — нужно динамически поставлять общеизвестные типы тех самых сущностей. Например, имеем контракт:


    [ServiceContract(Namespace = "http://mynamespace", SessionMode = SessionMode.Allowed)]
    public interface ISomeContract
    {
        [OperationContract]
        Entity[] Read();
    }



Чтобы получить все сущности в массив, как видно из контракта, мы должны вызывать метод 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 свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.