Nell'attuale compagnia per cui lavoro c'è una grande libreria di utilità. È stato scritto qualche anno fa (molto prima che mi unissi) e nel tempo è cresciuto in modo ergonomico per fare ora tutto:
- Invio di email
- Esportazione di file in diversi formati, ad esempio CSV, delimitato da tabulazioni
- Ricezione di dati da fornitori di terze parti, ad esempio Bloomberg, Facset
- Invio di file a siti SFTP
- Connessione al database generico
L'elenco continua ed è davvero brutto davvero.
Lo sviluppatore originale qui lo ha usato in ogni applicazione che ha scritto per convenienza e aggiunto ad esso se necessario. La stessa libreria di utilità contiene riferimenti a API di terze parti per eseguire alcuni dati in ricezione da Bloomberg / Factset. L'utilizzo di queste API di terze parti significa che qualsiasi progetto che voglia fare riferimento alla grande libreria di servizi di utilità deve anche avere le API dell'API di Bloomberg e le API di Facset. Anche la lista sta iniziando a crescere e sta diventando molto intrattabile e inutile avere tutte queste DLL di terze parti accompagnate da questo grande progetto di utilità, ma è necessario compilarle.
Voglio riscrivere l'intera libreria in librerie più gestibili. cioè:
- CompanyName.Email
- CompanyName.FileExporter
- CompanyName.Bloomberg
Ogni progetto quindi farà riferimento solo ai progetti necessari di cui ha bisogno per svolgere il proprio lavoro. riferimento a CompanyName.Email per inviare e-mail. Non ho problemi a farlo, ma la complicazione che ho di fronte è che alcune delle nuove librerie richiederanno la loro connessione al database e le loro query. L'esempio sotto è:
[HolidayChecker]
[HolidayChecker.DAL]
Memorizziamo un elenco di giorni festivi nel database. Quello che vorrei che il progetto di HolidayCheck dovesse fare è esporre un metodo (tra gli altri) per verificare se una determinata data è una festività.
public interface IHolidayChecker
{
bool IsHoliday(DateTime dateToCheck);
}
public class HolidayChecker : IHolidayChecker
{
public bool IsHoliday(DateTime dateToCheck)
{
//Query database for date logic...
}
}
Molte applicazioni faranno riferimento a questo progetto di HolidayCheck e utilizzeranno il metodo IsHoliday. Queste applicazioni avranno anche una propria connessione e query al database per eseguire le proprie attività.
[GenericApplication (References HolidayChecker)]
[GenericApplication.BusinessLogic]
[GenericApplication.DAL]
Se l'applicazione e il progetto di HolidayChecker accedono entrambi al database e interrogano i dati, questo si verifica pesantemente come l'odore del codice. Qualcuno è a conoscenza di un modo più ordinato per raggiungere questo obiettivo? O c'è? È qualcosa con cui dovrò solo convivere?
EDIT:
Pensando a questo durante la notte, non penso che sia un brutto primo pensiero. Progetti come ELMAH sono indipendenti che si collegano anche al database e fanno le loro domande. Come ha sottolineato @ Allan, è solo questione di progettare correttamente il mio progetto di HolidayCheck.