Web API с Unity IOC - Как разрешен мой DBContext Dependecy?

Мне нужна помощь в понимании единства и как работает IOC.

У меня это в моем UnityContainer

var container = new UnityContainer();

// Register types            
container.RegisterType<IService, Service>(new HierarchicalLifetimeManager());            

config.DependencyResolver = new UnityResolver(container);

Затем в моем контроллере веб-API я понимаю, что IService вводится Unity, потому что это зарегистрированный тип.

public class MyController : ApiController
{
    private IService _service;

    //-------  Inject dependency - from Unity 'container.RegisterType'
    public MyController(IService service)
    {
        _service = service;
    }   

    [HttpGet]
    public IHttpActionResult Get(int id)
    {
        var test = _service.GetItemById(id);
        return Ok(test);
    }
}

Мой сервисный интерфейс

public interface IService
    {
        Item GetItemById(int id);
    }

У моей службы реализации есть свой собственный конструктор, который принимает объект EntityFramework DBContext. (EF6)

public class Service : IService
    {
        private MyDbContext db;

        // ---  how is this happening!?
        public IService(MyDbContext context)
        {
            // Who is calling this constructor and how is 'context' a newed instance of the DBContext?
            db = context;
        }

        public Item GetItemById(int id)
        {
            // How is this working and db isn't null?
            return db.Items.FirstOrDefault(x => x.EntityId == id);
        }
    }
+5
источник поделиться
1 ответ

Причина, по которой он работает, заключается в том, что MyDbContext имеет конструктор без параметров (или имеет конструктор, содержащий параметры, которые могут быть разрешены единицей), и поскольку единство по умолчанию может разрешать конкретные типы без регистрации.

Цитата из эта ссылка:

При попытке разрешить конкретный класс без сопоставления, который не имеет соответствующей регистрации в контейнере, Unity создаст экземпляр этого класса и заполнит любые зависимости.

Вам также необходимо понять концепцию автоматической проводки.

Когда контейнер пытается разрешить MyController, он обнаруживает, что ему необходимо разрешить IService, который отображается на Service. Когда контейнер пытается разрешить Service, он обнаруживает, что ему необходимо разрешить MyDbContext. Этот процесс называется автоматической проводкой и выполняется рекурсивно до тех пор, пока не будет создан весь граф объекта.

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос