Il problema
Progetto C # costituito da servizi WCF utilizzati da un Flex applicazione.
Un cliente può richiedere una modifica di funzionalità che richiede di modificare il codice per funzionare solo per loro. Potrebbe essere una singola riga di codice in un metodo o forse un metodo agisce in modo totalmente diverso per il cliente x.
Le mie idee
-
Utilizza le filiali per i clienti che dispongono di una personalizzazione. Quando una versione è pronta, unire alle filiali del cliente e cercare di non rompere / dimenticare ciò che la loro personalizzazione era per. Utilizziamo SVN . Non sono un grande fan di questo dato che il codice base è molto grande.
-
Utilizza inversione del controllo , injection dependency e MEF . Creare un'interfaccia per le classi che devono essere modificate. Creare un nuovo progetto di libreria di classi (ovvero customerabc), aggiungere una nuova classe che implementa la classe appena creata, sovrascrivere il / i metodo / i come necessario per le modifiche del cliente. Aggiungi un'esportazione MEF. Quindi posto questo in una cartella di personalizzazione e punto MEF lì. Se trova un file DLL nella cartella, lo utilizza invece dell'esportazione dall'assembly in esecuzione.
Mi piace l'opzione 2.
Pro:
- Installazione di distribuzione semplice e normale, quindi rilasciare il file DLL.
- Ovvio: potrebbe non essere eccessivamente chiaro se un cliente sta eseguendo o meno un codice dal proprio ramo. Con questa opzione potrei semplicemente guardare la cartella di personalizzazione.
- Pulisci - esistono solo i file che devono essere personalizzati. Non c'è bisogno di una copia completa del bagagliaio. d. Promuove meglio SOLID per lo sviluppo futuro e il refactoring (questo progetto ha poco OOP ) .
Contro:
- Sarà più difficile gestire le modifiche nel trunk out ai progetti del cliente.
- Non risolve necessariamente il mio problema con le modifiche al database o le modifiche sul lato Flex.
- Se la modifica è una singola riga di codice in un metodo a 500 righe, non vedo alcuna altra opzione che sovrascrivere quel metodo, copia incolla il codice sull'override del cliente e apporta la modifica di una riga. Questo non è un buon uso di DEY per me, ma c'è un buon modo per aggirare questo?
- OK, un uso migliore dei principi OOP e SOLID potrebbe mitigare un po 'di questo, ma significa anche che per implementare una semplice richiesta del cliente, devo eseguire alcuni importanti refactoring per l'intera classe ... potenzialmente molte classi.
Che cosa dovrei fare?