А причем тут IoC? Я думал всегда, что IoC наоборот, чтобы разорвать связь между уровнями.
services.AddTransient, PersonService>(); эта строка не связь обеспечивает, она лишь говорит контейнеру, экземпляр какого конкретного класса создавать при запросе его из контейнера.
если вам необходимо, чтобы в конструктор сервиса передавался контекст данных, то добавляем его в IoC контейнер
services.AddTransient<DdContext>()
,
а в конструктор сервиса добавляем параметр, например,
public PersonService(DbContext context)
Те, когда вы запросите экземпляр IService, контейнер, скажем так, рекурсивно будет разрешать зависимости, те увидев зависимость сервиса от DbContext, и зная зарегистрированный класс, контейнер сначала создаст DbContext, затем создаст PersonService, передав в него созданный экземпляр DbContext.