8

que desarrollo (reescribir en WCF) un análisis de archivos de servicios web aceptando string[] y volviendo ISection[] pero en realidad se trata de un conjunto de interfaces anidadas:Contrato de datos tipos conocidos y un conjunto de interfaces de heredar entre sí

namespace Project.Contracts // Project.Contracts.dll 
{ 
    public interface ISection { } 

    public interface ISummarySection : ISection { } 

    public interface IDataSection : ISection { } 
} 

y clases:

namespace Project.Format.A // Project.Format.A.dll 
{ 
    [DataContract] 
    public class SummarySectionFormatA : ISummarySection { } 

    [DataContract] 
    public class DataSectionFormatA : IDataSection { } 
} 

interfaz de servicio y su implementación:

[ServiceContract] 
public interface IService // Project.Contracts.dll 
{ 
    ISection[] Parse(string format, string[] data); 
} 

[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public class Service : IService // Project.Service.dll 
{ 
    public ISection[] Parse(string format, string[] data) 
    { 
     return Factory.Create(format).Parse(data); 
    } 
} 

probé a configurar declaredTypes tanto en el servidor y los clientes:

<system.runtime.serialization> 
    <dataContractSerializer> 
    <declaredTypes> 
     <add type="Project.Contracts.ISumarySection, Project.Contracts"> 
     <knownType type="Project.Format.A.SummarySectionFormatA, Project.Format.A" /> 
     </add> 
     <add type="Project.Contracts.IDataSection, Project.Contracts"> 
     <knownType type="Project.Format.A.DataSectionFormatA, Project.Format.A" /> 
     </add> 
    </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

Pero teniendo el mismo error:

"Type 'DataSectionFormatA' with data contract name 'DataSection:http://schemas.example.com/Parse' is not expected.

o

The underlying connection was closed: The connection was closed unexpectedly.

no puede decorar con las interfaces KnownTypeAttribute porque los proyectos de Contratos no hacen referencia a los proyectos de Formato, y la referencia rompe el diseño. Es por eso que quiero usar config.

+0

Puedes publicar tus contratos de operación de servicio por favor –

+0

@hugh: Claro, actualizado. – abatishchev

Respuesta

0

tratando de hacer este trabajo:

[KnownType("GetKnownType")] 
public class Section 
{ 
    static Type[] GetKnownType() 
    { 
     return new[] 
     { 
      Type.GetType("Project.Format.A.DataSectionFormatA, Project.Format.A") 
     }; 
    } 
} 

pero parece que servidor y el cliente deben hacer referencia a Project.Format.A.dll hacerlo funcionar (método no devolver nulo)

2

Tome una mirada en el código de abajo

[ServiceContract] 
[ServiceKnownType(typeof(SummarySectionFormatA))] 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public interface IService {} 

public class Service : IService {} 
+0

Ok, lo tengo. Entonces sugieres decorar la interfaz (contrato de servicio) pero no la implementación. Pero como mencioné en la parte inferior de mi pregunta, no quiero hacerlo, porque la interfaz se coloca en Contracts.dll, que no hace referencia a otras dlls dentro del proyecto, y no puede evitar una referencia circular. Quiero usar una configuración. – abatishchev

1

Creo que debe cambiar su implementación un poco ... eche un vistazo a este question y ver si ayuda.

+0

Derecha. Mi pregunta principal es por qué la configuración no funciona. Parece porque el proyecto no está referenciado (lo que quiero evitar) y Type.GetType() devuelve null. Necesidad de cambiar la implementación de hecho. – abatishchev

+0

¡Correcto! El problema es que el Servicio depende de algo que se desconoce ... También quiero cuestionar el uso de la Interfaz para los Contratos de Datos, ¿por qué pretende abstraer eso? Recomendaría hacerlo tan concreto o pensar en ese ángulo también. – Wali

+0

Era el diseño inicial y funcionaba bien como parte de una aplicación web. Ahora estoy separando la lógica de análisis de la aplicación en un servicio web dedicado (WCF), por lo que trato de hacer eso sin grandes cambios de diseño primero. – abatishchev

Cuestiones relacionadas