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, и последствия.
Я никогда не пробовал, но вы можете попробовать добавить атрибуты, используя частичные классы и частичные методы.