DataContract WCF для классов в библиотеке, которую я не могу изменить
-
27-10-2019 - |
Вопрос
Привет, у меня есть библиотека классов, которая выполняет методы и имеет много разных классов, которые используют в качестве параметров для вызовов методов ... Я создаю обертку WCF для этой библиотеки классов. Но у меня нет разрешения на изменение библиотеки классов.
Теперь мой вопрос: как я могу легко разоблачить эти классы как контракты/данные данных.
У меня есть около 100 различных классов, которые мне нужны для этих методов.
Спасибо
Решение
Если вы действительно не можете изменить библиотеку, то я считаю, что ваш единственный выбор для разоблачения классов через WCF - это создание объектов обертки для каждого метода. Я бы посмотрел на написание генератора кода для этой задачи.
Вы можете подумать о наборе типов в сборке, которые вы хотите разоблачить, чтобы получить информацию о метаданных, которые вам нужны.
Вы можете использовать что -то вроде шаблонов T4 (часть VS 2008 и выше) и T4 Toolbox Чтобы создать генератор кода, чтобы написать код для вас. Как только генератор будет сделан, будет легко повторить снова, если ваша библиотека когда -либо изменится. Также легко исправить ошибки, обновляя генератор кода и повторно его.
Другой вариант, который я упоминаю только для полноты, но у которого есть некоторые колючие проблемы, - это разобрать и исправить рассматриваемый код. Вы можете использовать что -то вроде ILDASM, чтобы сбросить IL сборки, добавить необходимую атрибуцию WCF, а затем собрать его с помощью илазмы. Тем не менее, процесс может быть подвержен ошибке, каждый раз, когда собирает сборку, вам придется переделать процесс, могут быть юридические проблемы в зависимости от того, кому владеет IP-адрес Ассамблеи, и вам придется повторно подписать сборку, Потенциально с другим криптографическим сертификатом, если он должен быть сильной сборкой.
* Редактировать *
Запрашиваемый образец кода обертки:
public class ToWrap {
public String Name { get; set; }
public String Address { get; set; }
}
[DataContract]
public class Wrapper {
private ToWrap _wrapped;
// constructor for WCF marshalling
public Wrapper() {
_wrapped = new ToWrap();
}
public Wrapper(ToWrap wrapped) {
_wrapped = wrapped;
}
[DataMember]
public String Name {
get { return _wrapped.Name; }
set { _wrapped.Name = value; }
}
[DataMember]
public String Address {
get { return _wrapped.Address; }
set { _wrapped.Address = value; }
}
}
Другие советы
Если эти классы помечены как [сериализуемые], то вы все равно можете использовать их в ServiceContract WCF, но если это не так, то нет простого способа сделать это. У вас не будет выбора, кроме как создать новый набор классов, которые имеют одинаковые свойства, а затем скопируют их свойство за прохождением в эквивалентах библиотеки каждый раз, когда вы хотели вызывать одну из функций библиотеки.
Начиная с .NET 3.5 SP1 вам больше не обязательно указывать DATACONTRACT. Вы можете просто использовать классы в рамках вашего ServiceContract.
Для полного объяснения, проверьте Этот связанный вопрос, который обсуждает, когда использовать, а когда не использовать обработку данных и последствия.
Я никогда не пробовал, но вы могли бы попробовать добавить атрибуты, используя частичные классы и частичные методы.