Złożona logika biznesowa zwykle przechodzi w warstwę usług. Usługa może zależeć od jednego lub więcej repozytoriów w celu wykonywania operacji CRUD na twoich modelach. Zatem jedna operacja usługi reprezentująca operację biznesową może zależeć od wielu prostych operacji. Następnie możesz ponownie użyć tej warstwy usługi w kontrolerach i innych aplikacjach.
Oczywiście twoja usługa nie powinna zależeć od konkretnych implementacji repozytoriów. Aby zapewnić słabsze sprzężenie między warstwą usługi a repozytoriami, można użyć interfejsów. Oto przykład:
public interface IProductsRepository { }
public interface IOrdersRepository { }
...
public interface ISomeService
{
void SomeBusinessOperation();
}
public class SomeServiceImpl: ISomeService
{
private readonly IProductsRepository _productsRepository;
private readonly IOrdersRepository _ordersRepository;
public SomeServiceImpl(
IProductsRepository productsRepository,
IOrdersRepository ordersRepository
)
{
_productsRepository = productsRepository;
_ordersRepository = ordersRepository;
}
public void SomeBusinessOperation()
{
// TODO: use the repositories to implement the business operation
}
}
Teraz pozostało tylko skonfigurować ramkę DI, aby wprowadzić tę konkretną usługę do kontrolera.
public class FooController : Controller
{
private readonly ISomeService _service;
public FooController(ISomeService service)
{
_service = service;
}
public ActionResult Index()
{
// TODO: Use the business operation here.
}
}
Możesz zobaczyć, w jaki sposób interfejsy pozwalają nam zapewnić słabe połączenie między warstwami. Cała instalacja hydrauliczna jest wykonywana w ramach DI i wszystko jest przejrzyste i łatwe do testowania jednostkowego.
Darin w tym kontekście, co jest najlepszym sposobem, aby uzyskać dostęp do różnych repozytoriów z jednej usługi? Czy możesz mi również powiedzieć, jakie rozwiązanie byłoby na IoC/DI? – Chandu
Dziękuję Darin! –
Dzięki za wyjaśnienie Darin – Chandu