Использование интерфейса в качестве контракта данных для службы WCF

1

Я ищу лучший способ сделать это. У меня есть ряд типов данных, которые я хочу вернуть в WCF, по одному методу. Вот почему у меня есть MarkerInterface, так что мне не нужно 100s ServiceContracts/Methods просто преобразовывать данные.

Несчастливой частью является то, что все DataContracts (такие как currentbatch) уникальны, у них есть свой уникальный набор свойств. Причина, по которой у меня есть Трансформатор, заключается в том, что все они требуют какого-то преобразования данных, основанного на наборе данных.

Интерфейс трансформатора выглядит следующим образом:

public interface IDataTransformer
{
    IMarkerInterface Transform(DataSet inDataSet_);
}

Тогда у меня есть библиотека трансформатора для каждого datacontract (что я объясню ниже)

public class CurrentBatch_Transformer : IDataTransformer
{
}

Это один из многих данных, которые я буду иметь, которые реализуют IMarkerInterface.

[DataContract]
public class CurrentBatch : IMarkerInterface
{
    [DataMember]
    public string GroupName { get; set; }

    [DataMember]
    public bool FlagLocked { get; set; }
}

Итак, поскольку у меня есть IMarkerInterface; Я могу разместить все в одном методе (GetDataUsingDataContract) и взять их соответствующий трансформатор и DataSet.

    public IMarkerInterface GetDataUsingDataContract(IDataTransformer composite, DataSet inData_)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }

        return composite.Transform(inData_);
    }

Опять же, мои вопросы:

1) Это хорошая практика? Если это не так; почему, и есть ли лучший способ сделать это?

2) Будет ли интерфейс сериализован во время сериализации WCF? (Я не хочу, чтобы он сериализовался, но не против, если бы это произошло).

Теги:
wcf
interface
datacontract

1 ответ

2
Лучший ответ

Да, это приемлемое решение, но вы должны дать WCF знать, какие типы вы собираетесь использовать, потому что он должен формировать документ WSDL. Вы можете использовать либо атрибут ServiceKnownType для ServiceContract, KnownType для контракта данных, либо добавлять известные типы в config.

Вот примеры:

  1. Контракт на обслуживание:

    [ServiceKnownType("GetKnownTypes", typeof(Helper))]
    [ServiceContract()]
    public interface IService
    {
        [OperationContract]
        IMarkerInterface GetMarker();
    }
    
    static class Helper 
    {
        static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
        {
            return new Type[] { typeof(CurrentBatch) };
        }
    }
    
  2. KnownType:

    [DataContract]
    [KnownType("GetKnownType")]  //there are few option of usage, you can apply for one concrete class: [KnownType(typeof(InheritedClass))]
    public class BaseClass
    {
    
        private static Type[] GetKnownType()
        {
            return return new Type[] { typeof(InheritedClass) };;
        }
    }
    
  3. Файл конфигурации:

    <system.runtime.serialization>
      <dataContractSerializer>
        <declaredTypes>
          <add type="MyProject.IMarkerInterface, MyProjectAssembly">
            <knownType type="MyProject.CurrentBatch, MyProjectAssembly"/>
          </add>
        </declaredTypes>
      </dataContractSerializer>
    </system.runtime.serialization>
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню