The principle states:

    A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    B. Abstractions should not depend on details. Details should depend on abstractions.

Zastanawia mnie sformułowanie HIGH/LOW LEVEL MODULE. Biorąc pod lupę aplikacje MVC - kod, który używa Ninject do wstrzykiwania zależności przez konstruktor oraz poniższy diagram chciałbym dowiedzieć się czy dobrze rozumiem co oznacza LOW/HIGH LEVEL MODULE.

user image

 
public interface IProductRepository
{
     IQueryable<Product> Products { get; }
}
public class EFProductRepository : IProductRepository
    { 
        public EFDbContext context = new EFDbContext();

        public IQueryable<Product> Products
        {
            get { return context.Products; }
        }
}
 

W moim przykładzie LOW LEVEL MODULE czyli EFProductRepository dziedziczy po interfejsie z którym też będzie komunikować się HIGH LEVEL MODULE. Dzięki temu że oba komponenty komunikują się z tym samym interfejsem możliwe jest nie tworzenie zależności pomiędzy klasami (HIGH LEVEL MODULE (ProductController) będzie komunikował się z LOW LEVEL MODULE poprzez interfejs).

public class ProductController : Controller
    {
private IProductRepository repository;

        public ProductController(IProductRepository productRepository) 
        {
            this.repository = productRepository;
        }
}
 
 
public class NinjectControllerFactory : DefaultControllerFactory
    {

ninjectKernel.Bind<IProductRepository>().To<EFProductRepository>();