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.
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>();