DataContract WCF для классов в библиотеке, которую я не могу изменить

StackOverflow https://stackoverflow.com/questions/5344121

  •  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.

Для полного объяснения, проверьте Этот связанный вопрос, который обсуждает, когда использовать, а когда не использовать обработку данных и последствия.

Я никогда не пробовал, но вы могли бы попробовать добавить атрибуты, используя частичные классы и частичные методы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top