Wacf datacontract для классов в библиотеке, которые я не могу изменить - PullRequest
3 голосов
/ 17 марта 2011

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

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

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

Спасибо

Ответы [ 4 ]

2 голосов
/ 17 марта 2011

Если вы действительно не можете изменить библиотеку, то я считаю, что единственный способ представить классы через 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; }
  }
}
1 голос
/ 19 апреля 2016

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

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

1 голос
/ 17 марта 2011

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

0 голосов
/ 17 марта 2011

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

...