WCF и BLToolkit. Как мне удалось их скрестить.
От: Shadowspan Россия  
Дата: 30.07.07 12:41
Оценка: 34 (3)
Сначала вносим некоторые изменения в сам 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'ы ходят. Копировать библиотеки на клиент не надо.

Может стоит еще потестировать и включить решение в основной код?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.