Abbiamo un livello di business logic (BLL) strettamente accoppiato al nostro livello di accesso ai dati (DAL). Facciamo chiamate in questo modo:
using (FooData data = new FooData())
{
data.DoSomething();
}
È importante notare che tutte le nostre classi di dati sono internal
e sono nello stesso assembly delle classi logiche, in modo che solo il BLL possa accedere al DAL.
Per disaccoppiare questi (per facilitare il test delle unità), un'idea è quella di creare interfacce IDataClass, come IFooData. All'inizio ho pensato che potesse essere un problema perché dovevamo rendere pubbliche le nostre classi di dati per implementare le interfacce. Ma dovremmo essere in grado di mantenere le classi di dati interne, anche se abbiamo ancora bisogno che i metodi siano pubblici:
public interface IFooData
{
void DoSomething();
}
internal class FooData : IFooData // Notice the class is internal
{
public void DoSomething(); // Method is public, but that's ok because class is internal
}
Quindi, anche se il metodo è pubblico, poiché la classe stessa è interna, dovremmo comunque consentire solo il nostro accesso BLL.
C'è qualcosa di intrinsecamente sbagliato in questo approccio? C'è un modo migliore per astrarre il DAL, per testare le unità, senza aprire il DAL al mondo rendendolo pubblico?