Tenemos una capa de lógica de negocios (BLL) que está estrechamente unida a nuestra capa de acceso a datos (DAL). Hacemos llamadas como esta:
using (FooData data = new FooData())
{
data.DoSomething();
}
Es importante tener en cuenta que todas nuestras clases de datos están internaly están en el mismo ensamblaje que las clases lógicas, de modo que solo el BLL puede acceder al DAL.
Para desacoplarlos (para ayudar a facilitar las pruebas unitarias), una idea es crear interfaces IDataClass, como IFooData. Al principio pensé que podría ser un problema porque tendríamos que hacer públicas nuestras clases de datos para implementar las interfaces. Pero deberíamos poder mantener las clases de datos internas, a pesar de que todavía necesitamos que los métodos sean públicos:
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
}
Entonces, aunque el método es público, dado que la clase en sí es interna, deberíamos permitir solo nuestro acceso BLL.
¿Hay algo inherentemente malo con este enfoque? ¿Existe una mejor manera de abstraer el DAL, para pruebas unitarias, sin abrir el DAL al mundo haciéndolo público?