2010-12-14 30 views
1

J'ai un service WCF et une application client WPF, construite à l'aide du modèle MVVM. Le service WCF référencé permet au client WPF de manipuler des contrats qui décrivent les données qui peuvent être envoyées et reçues du service.Contrats WCF et modèles dans un client MVVM

Exemple contrat, défini côté service:

[DataContract()] 
public class UserContract : BaseContract 
{ 
    [DataMember()] 
    public string UserName { get; set; } 
    [DataMember()] 
    public string FirstName { get; set; } 
} 

Si je considère les contrats établis dans le cadre du niveau du modèle de mon application MVVM, ce qui devrait être la relation entre ces contrats et les classes de modèle de mon Modèle Tier? (Exemples de code du côté client)

1. Héritage? Les modèles héritent des contrats.

public class UserModel : UserContract 

2. Composition? Les modèles contiennent une instance du contrat correspondant.

public class UserModel 
{ 
    public UserContract userContract {get;set;} 
} 

3. Ajout? Les contrats étant déclarés Partiels, je pourrais simplement "compléter" les contrats, et les utiliser directement comme mes classes de modèles.

public partial class UserContract 
{ 
} 

Répondre

4

je vous recommande devez garder votre Model Layer séparé de Contract Layer. Je pense que les contrats devraient agir comme DTOs ou Messages entre l'application et le service et c'est tout.

--EDIT--

  • Model Layer/Business Layer: Composé de Business Logic et Business Rules.

  • Contract Layer: Composé de Models et d'autres informations nécessaires pour envoyer/recevoir des données correctement.

Exemple:

[Cet exemple utilise modèle de requête/réponse.]

Modèle:

public class User 
{ 
    public String Username { get; set; } 
    public String Password { get; set; } 
} 

Contrats:

public class GetUsersRequest 
{ } 

public class GetUsersResponse 
{ 
    public List<User> Users { get; set; } 
    public Boolean IsSuccess { get; set; } 
} 

Service:

public interface IUserService 
{ 
    GetUsersResponse GetUsers(GetUsersRequest request); 
} 

public class UserService : IUserService 
{ 
    public GetUsersResponse GetUsers(GetUsersRequest request) 
    { 
     GetUsersResponse response = new GetUsersResponse(); 
     //... 
     return response; 
    } 
} 

Si vous voyez ici, le contrat GetUsersResponse est composé de List of Users. Il est utilisé pour transférer Users de Service à Client. Par contre, Model Layer ne sait rien sur Contract Layer. C'est important. Business Entities ne devrait rien savoir sur les autres calques. Il devrait toujours y avoir des classes dans Business Layer qui peuplent ces entités de Data Layer.

+0

@decyclone: ​​Vous voulez dire une quatrième option: Séparation - Contrat sont utilisés pour construire le modèle sur receivings, les modèles sont utilisés pour construire des contrats sur les envois, par le biais d'autres objets (Référentiels/usines) sans lien gardé pendant d'autres tâches? – Matthieu

+0

@decyclone: ​​Compte tenu de vos modifications, vous proposez de conserver entièrement le calque de modèle du côté service, étant "scellé" pour le client? – Matthieu

+0

Non, il devrait être un ensemble partagé à la fois par le service et le client. – decyclone