Temos uma camada de lógica de negócios (BLL) fortemente acoplada à nossa camada de acesso a dados (DAL). Fazemos chamadas assim:
using (FooData data = new FooData())
{
data.DoSomething();
}
É importante observar que todas as nossas classes de dados estão internal
e estão no mesmo assembly que as classes lógicas, para que apenas o BLL possa acessar o DAL.
Para dissociá-los (para ajudar a facilitar o teste de unidade), uma idéia é criar interfaces IDataClass, como o IFooData. No começo, pensei que poderia ser um problema, porque teríamos que tornar nossas classes de dados públicas para implementar as interfaces. Mas devemos ser capazes de manter as classes de dados internas, mesmo que ainda precisemos que os métodos sejam 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
}
Portanto, mesmo que o método seja público, uma vez que a própria classe é interna, ainda devemos permitir apenas o acesso à BLL.
Existe algo inerentemente errado com essa abordagem? Existe uma maneira melhor de abstrair o DAL, para testes de unidade, sem abrir o DAL para o mundo tornando-o público?