Il motivo principale per cui avresti le interfacce per i tuoi repository nel tuo BLL è di evitare di avere riferimenti rigidi al DAL separato ma invece di cambiare il riferimento DAL al BLL stabile.
Per poter sostituire le implementazioni senza modificare la BLL stabile
Su Internet questo potrebbe non essere il motivo principale in generale, ma questo sarebbe un motivo convincente per preferire l'opzione 2 nella tua situazione.
Supponiamo che tu stia utilizzando un contenitore DI (iniezione di dipendenza). Se si configura questo utilizzando un file di configurazione, ad esempio, si dirà al contenitore che è possibile trovare le implementazioni per le interfacce del repository nel BLL nel progetto DAL.Sql. Una volta che si passa a una soluzione NoSQL, si crea il progetto DAL.NoSQL, lo si distribuisce e si modifica la configurazione del contenitore DI per risolvere le implementazioni del repository dal nuovo progetto. Il tuo nuovo DAL dipende dalla BLL stabile che non ha bisogno di cambiare.
Tuttavia, se si utilizza l'opzione 1, potrebbe non essere possibile scambiare a caldo il progetto DAL. Ad esempio, se si utilizza .NET, è possibile che si verifichino problemi in cui il progetto BLL dipende da una determinata versione della dll DAL e non sarà possibile sostituire il DAL senza modificare anche il BLL.
Poiché l'interfaccia del repository fa parte della BLL
Un repository è semplicemente un gateway che definisce in che modo la tua applicazione recupererà i dati. In questo senso è tanto una parte della logica di business quanto i tuoi oggetti di dominio. Le implementazioni concrete possono cambiare, ma le interfacce stesse fanno parte della tua logica aziendale.
Perché isola BLL
Avere le interfacce e le implementazioni nel DAL significa portare tutto il DAL nella BLL. Non c'è nulla che impedisca agli sviluppatori di utilizzare oggetti dal progetto DAL in modi che non dovrebbero essere utilizzati. Avere il DAL dipende dal BLL significa che il BLL può contenere solo le interfacce di cui ha bisogno.
Per evitare un progetto separato con gli oggetti dominio
I tuoi DAL e BLL dipendono entrambi dagli oggetti del tuo dominio. Se il BLL ha una classe che utilizza un repository e un oggetto dominio, non è possibile inserire le interfacce del repository nel DAL in quanto crea un riferimento circolare (BLL richiede l'interfaccia per il repository in DAL, DAL richiede oggetti dominio in BLL). Quindi dovresti dividere il BLL e gli oggetti del dominio in due progetti in modo che il tuo BLL possa fare riferimento al dominio e il DAL e il DAL possono anche fare riferimento al dominio.