La verità è che suddividere i servizi WCF o qualsiasi servizio è un atto di bilanciamento.Il principio è che si desidera mantenere una pressione al ribasso sulla complessità pur continuando a considerare le prestazioni.
Più servizi creerai, maggiore sarà la configurazione che dovrai scrivere. Inoltre, aumenterai il numero di classi proxy che devi creare e mantenere dal lato client.
Mettere troppi ServiceContracts su un servizio aumenterà il tempo necessario per generare e utilizzare un proxy. Ma, se si finisce con una o due operazioni su un contratto, si avrà una maggiore complessità del sistema con molto poco da guadagnare. Questa non è una prescrizione scientifica, ma una buona regola empirica potrebbe essere di circa 10-20 OperationContracts per ServiceContract.
L'accoppiamento di classe è ovviamente una considerazione, ma si tratta davvero di preoccupazioni separate? Dipende da ciò che fa il tuo sistema, ma la maggior parte dei sistemi si occupa solo di alcune aree di interesse, quindi suddividere le cose potrebbe non ridurre in realtà l'accoppiamento di classe.
Un'altra cosa da ricordare, e questo è estremamente importante è sempre rendere i metodi più generici possibile. Le offerte WCF in DataContracts per un motivo. DataContracts significa che è possibile inviare qualsiasi oggetto da e verso il server fintanto che i DataContracts sono noti.
Così, per esempio, si potrebbe avere 3 OperationContracts:
[OperationContract]
Person GetPerson(string id);
[OperationContract]
Dog GetDog(string id);
[OperationContract]
Cat GetCat(string id);
Ma, fintanto che questi sono tutti i tipi conosciuti, si potrebbe unire questi per una sola operazione come:
[OperationContract]
IDatabaseRecord GetDatabaseRecord(string recordTypeName, string id);
In definitiva, questa è la cosa più importante da considerare quando si progettano contratti di assistenza. Questo vale per REST se si utilizza una serializzazione DataContract come il metodo di serializzazione.
Infine, tornare sui ServiceContracts ogni pochi mesi ed eliminare le operazioni che non vengono utilizzate dai client. Questo è un altro grande!
Se si utilizzano file di classe/interfaccia parziali per evitare conflitti di unione, per quanto riguarda l'argomento "non si ridimensionerà"? Cosa significa tecnicamente? – Askolein
@Askolein ... Significa che se si è stipati troppo in un unico contratto può diventare un collo di bottiglia per le prestazioni e un mal di manutenzione/estensibilità. –
grazie per la tua risposta, ma la mia domanda era più "perché" potrebbe essere un problema di prestazioni non "cosa" è un problema di prestazioni. Dici "bottleneck": ho capito che in ISS/WCF ogni richiesta web è una nuova istanza di servizio. Più richieste su un unico grande servizio sarebbero sempre più istanze, non un'istanza al servizio di tutte. Quindi nessun problema di ridimensionamento. Questo ragionamento è giusto? – Askolein