Wcf datacontract для классов в библиотеке, которые я не могу изменить

Привет у меня есть библиотека классов, которая выполняет методы и имеет много разных классов, которые она использует в качестве параметров для вызовов методов... Я создаю оболочку wcf для этой библиотеки классов. но у меня нет разрешения на изменение библиотеки классов.

Теперь мой вопрос: как я могу легко представить эти классы как контракты данных / камеры данных?

У меня есть около 100 различных классов, которые мне нужны для этих методов.

Спасибо

4 ответа

Решение

Если вы действительно не можете изменить библиотеку, то я полагаю, что единственный способ представить классы через WCF - создать объекты-оболочки для каждого метода. Я хотел бы посмотреть на написание генератора кода для этой задачи.

Вы можете поразмышлять над набором типов в сборке, которую вы хотите предоставить, чтобы получить необходимую информацию о метаданных типа.

Вы можете использовать что-то вроде шаблонов t4 (часть VS 2008 и выше) и T4 Toolbox, чтобы создать генератор кода для написания кода для вас. После того, как генератор будет готов, будет легко снова запустить его, если ваша библиотека когда-либо изменится. Также легко исправить ошибки, обновив генератор кода и перезапустив его.

Другой вариант, который я упоминаю только для полноты, но который имеет некоторые острые проблемы, состоит в том, чтобы разбирать и исправлять соответствующий код. Вы можете использовать что-то вроде ildasm, чтобы выгрузить файл сборки, добавить необходимую атрибуцию WCF и затем снова собрать его с помощью ilasm. Однако этот процесс может быть подвержен ошибкам, и каждый раз, когда в сборку вносятся изменения, вам придется повторить процесс, могут возникнуть юридические проблемы в зависимости от того, кому принадлежит 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; }
  }
}

Если эти классы помечены как [Serializable], то вы все равно можете использовать их в WCF ServiceContract, но если нет, то нет простого способа сделать это. У вас не будет выбора, кроме как создать новый набор классов с такими же свойствами, а затем копировать их свойство за свойством в эквиваленты библиотеки каждый раз, когда вы захотите вызвать одну из функций библиотеки.

Начиная с.Net 3.5 SP1 вам больше не нужно указывать DataContract. Вы можете просто использовать классы в вашем ServiceContract.

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

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

Другие вопросы по тегам