Сначала вносим некоторые изменения в сам BLToolkit, дабы он генерировал атрибуты DataContract и DataMember.
В класс AbstractClassBuilder, метод DefineNonAbstractType, в самый конец:
if(_context.Type.GetCustomAttributes(typeof (DataContractAttribute)).Length > 0)
_context.TypeBuilder.SetCustomAttribute(typeof(DataContractAttribute));
В класс BuildContext, метод CreateField :
public FieldBuilder CreateField(string fieldName, Type type, FieldAttributes attributes)
{
FieldBuilder field = TypeBuilder.DefineField(fieldName, type, attributes);
field.SetCustomAttribute(MethodBuilder.Type.Assembly.BLToolkitAttribute);
// Это я добавил
if (Type.GetCustomAttributes(typeof(DataContractAttribute)).Length > 0)
{
CustomAttributeBuilder cab = new CustomAttributeBuilder(
typeof(DataMemberAttribute).GetConstructor(new Type[] { }), new object[] { });
field.SetCustomAttribute(cab);
}
// Конец вставки
Items.Add("$BLToolkit.Field." + fieldName, field);
return field;
}
Далее создаем специальный аттрибут:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
public class BLToolkitKnownTypeAttribute : Attribute, IOperationBehavior
{
private Type knownType;
public BLToolkitKnownTypeAttribute(Type type)
{
object obj = TypeAccessor.CreateInstanceEx(type);
knownType = obj.GetType();
}
public void Validate(OperationDescription operationDescription)
{
if(!operationDescription.KnownTypes.Contains(knownType))
operationDescription.KnownTypes.Add(knownType);
}
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
}
public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters)
{
}
}
Пример:
DataContract:
[DataContract]
public abstract class Principal
{
public abstract long ID { get; set;}
public abstract string Name { get; set; }
public abstract bool IsGroup { get; set; }
public abstract bool Disabled { get; set; }
}
ServiceContract:
[ServiceContract]
public interface IUserRightsManager
{
[OperationContract]
[BLToolkitKnownType(typeof(Principal))]
List<Principal> GetAllPrincipal();
[OperationContract]
[BLToolkitKnownType(typeof(Principal))]
void ChangeDisablePricipal(Principal principal);
}
Все. DataContract'ы ходят. Копировать библиотеки на клиент
не надо.
Может стоит еще потестировать и включить решение в основной код?