2011-12-02 3 views
1

У моего клиента есть 10 таблиц, которые необходимо загрузить через внутренний WCF на сервер. Поскольку все это является внутренним, я могу написать как клиент, так и сервер, используя любую технику, которую я хочу.C# - WCF - Generics - [KnownType (typeof (xxx))]

На клиенте, я думал использовать LINQ для загрузки данных из таблиц в список, список и так далее ...

На сервере, я думал, чтобы иметь [DataContract] как следовать :

[DataContract] 
[KnownType(typeof(Table1))] 
[KnownType(typeof(Table2))] 
[KnownType(typeof(Table3))] 
public class GenericType<T> 
{ 
    [DataMember] 
    public List<T> Data { get; set; } 
} 

и затем добавить классы, которые будут представлять соответствующие таблицы на клиенте.

[DataContract] 
public class Table1 
{ 
    [DataMember] 
    public int UserID { get; set; } 
    [DataMember] 
    public string FullName { get; set; } 
} 

[DataContract] 
public class Table2 
{ 
    [DataMember] 
    public int UserID { get; set; } 
    [DataMember] 
    public string Address1 { get; set; } 
} 

[DataContract] 
public class Table3 
{ 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
} 

Когда я создаю ссылку клиента, я не получаю все классы, объявленные на сервере, и кажется, что только первый [KnownType] указывается на [DataContract] становится видимым для клиента.

Я был под впечатлением, что Дженерики должно было разрешить несколько типов но я право думать, что WCF может обрабатывать только один [KnownType] х класс ??

И если да, то мой единственный способ кодировать это будет скопируйте и вставьте 10 раз класс GenericType и на каждую копию измените [KnownType] ??

Причина, если это единственное решение, тогда каковы реальные преимущества использования Generic вместо прямого определения List, List для моих параметров?

Любая мысль поможет прояснить мой ум здесь


Проблема происходит потому, что если один из методов WCF не использует какой-либо из классов, объявленных [DataContract] ... кажется, что WCF НЕ приносит тех, классов для Клиента.

Это ожидаемый случай?

+0

всегда полезно опубликовать обследование! – esskar

+0

@esskar Обновлено –

+0

«Я получаю сообщение об ошибке». Какая ошибка? Также KnownTypes «Table1», «Table2» и т. Д. Также должны быть отмечены [DataContract] и [DataMember]. – ErnieL

ответ

1

Вы можете попробовать приписать свой метод интерфейса атрибуту ServiceKnownType для каждого из классов.

Существует еще один вариант, который заключается в реализации общих списков классов, которые приписываются с CollectionDataContract:

[CollectionDataContract] 
public class Table1Collection 
    Inherits List<Table1> 

На стороне клиента, вы можете редактирования Reference.svcmap и перечислением каждых из коллекций в раздел CollectionMappings:

<CollectionMappings> 
    <CollectionMapping TypeName="My.Namespace.Table1Collection" Category="List" /> 

Это позволяет использовать один и тот же код на обоих концах трубы.

+0

Если я реализую это [CollectionDataContract], значит ли это, что мне нужно создать 10 разных классов, каждый из которых указывает на разные таблицы? Если да, то где преимущество, а не 10 классов, которые непосредственно реализуют List ... и так далее? –

+0

Вы получили бы выгоду от этого подхода, если бы у вас была бизнес-логика в классах коллекций и вы хотели бы повторно использовать эту логику как для клиента, так и для сервера. –

+0

Хороший вопрос ... еще раз спасибо. –

Смежные вопросы