2009-07-30 7 views
2

J'ai un scénario de service de service WCF comme ceConsommez service WCF avec le même nom et même espace de noms cible de BizTalk

Company.BO.Contracts espace de noms {

public interface ITypeService { } 

public partial interface IType1Services : ITypeService 
{ 
    [OperationContract()] 
    Type1 GetType1(System.Int32 idValue); 

    [OperationContract()] 
    Type1 Save(Type1 myType1, System.Int32 changeUser); 
} 

public partial interface IType2Services : ITypeService 
{ 
    [OperationContract()] 
    Type2 GetType2(System.Int32 idValue); 

    [OperationContract()] 
    Type2 Save(Type2 type2, System.Int32 changeUser); 
} 

}

de la Société d'espace de noms. ContractFulfillment {

public class Type1Services : IType1Services 
{ 
    public MyType1 GetType1(System.Int32 idValue) 
    { 
     return new Type1(); 
    } 
} 

public class Type2Services : IType2Services 
{ 
    public Type2 GetType2(System.Int32 idValue) 
    { 
     return new Type2(); 
    } 
} 

}

Lorsque j'expose le code ci-dessus en tant que service WCF, BizTalk n'est pas capable de distinguer entre Type1.Save() et Type2.Save(). Existe-t-il un moyen sans modifier le service, car le service fait partie d'un cadre et nécessite plus de changements dans d'autres lieux dépendants?

Pour les clients autres que BizTalk, la couche d'accès au service est encapsulée dans la bibliothèque de types (type1, type2, etc.) et les clients accèdent à cette bibliothèque de types en tant que bibliothèque de classes normale.

+0

Pouvez-vous être plus précis sur ce que vous voulez dire quand vous dites "BizTalk n'est pas capable de distinguer Type1.Save() et Type2.Save()"? En outre, que se passe-t-il si vous essayez de le consommer en utilisant un client WCF ("Ajouter une référence de service")? –

Répondre

0

Pouvez-vous mettre un [ServiceContractAttribute (Namespace = "http://company.com/services/type1/")] sur l'interface de type 1? Utilisez un espace de noms différent pour chaque contrat de service, car ce sont des contrats différents.

+0

2ème - Un espace de noms différent pour chaque contrat de service n'est pas possible coz, ceux-ci proviennent d'un cadre en place; modifier l'espace de noms réduira d'autres applications, qui consomment les services. Le biztalk est la dernière initiative pour s'intégrer à un autre système relativement nouveau. 1er - Tous les types (type1 ... n) sont exposés avec l'espace de noms Services.Core et le nom spécifique comme ci-dessous. [ServiceContract (Namespace = "http://company.com/services/core", Name = "Type1 Interface")] – Muralidhar

0

Vous pouvez construire un service WCF que vous avez placé entre le cadre et Biztalk

Mettre en œuvre Type1.Save() comme Type1.SaveType1() dans ce nouveau service.

Pas particulièrement élégant mais cela fonctionnerait.

+0

En effet, nous faisons la même chose. Mais, je pense que c'est redondant. J'ai trouvé une autre implémentation utilisant des pipellnes personnalisées, ce qui me permet de changer les espaces de noms source et cible (en utilisant un .net avec 2 propriétés pour les espaces de noms source et cible) et de les configurer. Mais, quand plus de contrats de données sont exposés et le non. des orchestrations grandissent, ce qui est difficile à maintenir et à modifier, si quelque chose ne va pas (aspect à haute maintenance!). – Muralidhar

Questions connexes