2010-05-04 14 views
0

J'ai un service de reporting qui implémente un certain nombre de rapports. Chaque rapport nécessite certains paramètres. Des groupes de paramètres logiquement liés sont placés dans une interface, que le rapport met alors en œuvre:Test de l'implémentation de l'interface dans WCF/SOA

[ServiceContract] 
[ServiceKnownType(typeof(ExampleReport))] 
public interface IService1 
{ 
    [OperationContract] 
    void Process(IReport report); 
} 

public interface IReport 
{ 
    string PrintedBy { get; set; } 
} 

public interface IApplicableDateRangeParameter 
{ 
    DateTime StartDate { get; set; } 

    DateTime EndDate { get; set; } 
} 

[DataContract] 
public abstract class Report : IReport 
{ 
    [DataMember] 
    public string PrintedBy { get; set; } 
} 

[DataContract] 
public class ExampleReport : Report, IApplicableDateRangeParameter 
{ 
    [DataMember] 
    public DateTime StartDate { get; set; } 

    [DataMember] 
    public DateTime EndDate { get; set; } 
} 

Le problème est que la WCF DataContractSerializer ne pas exposer ces interfaces dans ma bibliothèque client, donc je ne peux pas écrire le rapport générique générant front-end que je prévois de. WCF peut-il exposer ces interfaces ou s'agit-il d'une limitation du sérialiseur? Si ce dernier cas, alors quelle est l'approche canonique de ce modèle OO?

J'ai examiné NetDataContractSerializer mais cela ne semble pas être une implémentation officiellement prise en charge (ce qui signifie que ce n'est pas une option dans mon projet). Actuellement, je me suis résigné à inclure les interfaces dans une bibliothèque qui est commune entre le service et l'application cliente, mais cela me semble une dépendance supplémentaire inutile. Sûrement il y a une manière plus directe de faire ceci? J'avais l'impression que WCF était censé remplacer .NET remoting; vérifier si un objet implémente une interface semble être l'une des fonctionnalités les plus élémentaires requises d'une interface à distance?

Répondre

0

Je crois que vous avez juste besoin de mettre l'attribut ServiceContract sur les DEFINITIONS d'interface, aussi, comme dans

[ServiceContract] 
public interface IReport 
{ 
    [OperationContract] 
    string PrintedBy { get; set; } 
} 

etc ...

+0

J'ai essayé (avec un léger changement: l'attribut OperationContract doit être appliqué pour obtenir/définir individuellement) mais cela ne fonctionne pas. ServiceContracts mappe aux messages, malheureusement. – rabidpebble