Универсальный СервисКонтракт - PullRequest
1 голос
/ 17 августа 2010
[ServiceContract]
public interface ISecurities<T> : IPolicyProvider where T: EntityObject 
{
  [OperationContract(Name="GetAllSecurities")]
    IEnumerable<T> GetSecurities();

  [OperationContract]
  IEnumerable<T> GetSecurities<T1>(List<T1> lstIdentifiers) where T1 : FI_CusipMaster;

  [OperationContract]
  T GetSecurity<T1>(T1 lstIdentifiers) where T1 : FI_CusipMaster;
}

//Host
        ///CADIS Contract
        ServiceHost dmHost = new System.ServiceModel.ServiceHost(typeof(GlobalInvestors.FIPA.BLL.UDI.CADISSecurities));

        Uri baseAddress = dmHost.BaseAddresses[0];
        Uri policyAddress = new Uri(baseAddress.AbsoluteUri.Replace(baseAddress.AbsolutePath, ""));

        dmHost.AddServiceEndpoint(
            typeof(GlobalInvestors.FIPA.BLL.IPolicyProvider),
            new System.ServiceModel.WebHttpBinding(),
            policyAddress).Behaviors.Add(new System.ServiceModel.Description.WebHttpBehavior());

        dmHost.Open();

 //App.Config
  <service behaviorConfiguration="UDIBehaviour" name="GlobalInvestors.FIPA.BLL.UDI.CADISSecurities">
    <endpoint binding="basicHttpBinding" contract="GlobalInvestors.FIPA.BLL.UDI.ICADISSecurities" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:1667/CADIS" />
      </baseAddresses>
    </host>
  </service>
  <behavior name="UDIBehaviour">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>

[ServiceContract]
[ServiceKnownType(typeof(SecurityMasterAdapter))]
public interface ICADISSecurities :ISecurities<SecurityMasterAdapter>
{

}

Я получаю "InvalidDataContractException Type 'System.Collections.Generic.List`1 [T1]' не может быть экспортирован как тип схемы, потому что это открытый универсальный тип. Вы можете экспортировать универсальный тип, только если все егоуниверсальные типы параметров являются фактическими типами. "если я размещаю этот контракт.

Я прочитал, что в сервисе ServiceContract желательно избегать генериков.но можно ли использовать T?

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Ваша проблема в этом случае - не T в ServiceContract, а T1, используемый в качестве DataContract. Вы можете использовать T в контракте на обслуживание, если вы замените T конкретным типом во время реализации контракта на обслуживание. Для контрактов данных (параметры операции и типы возврата) вы не можете использовать T вообще. Вы всегда должны указать конкретный тип. Ваш контракт на обслуживание может быть переписан с использованием ServiceKnownTypeAttribute, так что T1 заменяется на FI_CusipMaster, а ServiceKnownType указывает все возможные классы, производные от FI_CusipMaster.

Редактировать: Другой способ - не использовать ServiceKnownType и использовать KnownTypeAttribute, который должен быть определен для типа FI_CusipMaster.

С уважением, Ладислав

1 голос
/ 17 августа 2010

В вашем примере T является универсальным типом. Вы не можете использовать универсальный тип в ServiceContract, если он не используется с параметром определенного типа - как в class Foo : List<int> { }.

1 голос
/ 17 августа 2010

Как говорит ошибка, нет, вы не можете использовать T. Сервисные контракты должны быть в состоянии выписать информацию сериализации, которая имеет дело с определенными типами.Он не может обрабатывать открытые дженерики в экспортируемых функциях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...