2016-05-25 3 views
5

Мне нужна помощь в понимании единства и как работает МОК.Web API с Unity IOC - Как разрешен мой DBContext Dependecy?

У меня есть это в моей UnityContainer

var container = new UnityContainer(); 

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

config.DependencyResolver = new UnityResolver(container); 

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

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); 
     } 
    } 
+0

Скорее всего, 'MyDbContext' имеет конструктор без параметров. Unity может разрешать конкретные классы без регистрации. –

ответ

2

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

Цитируя this reference:

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

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

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

+1

Это какая-то сумасшедшая черная магия! Это было очень четкое объяснение. Спасибо. – duyn9uyen

+1

Добро пожаловать. [Не очень хорошая магия, на мой взгляд] (http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/). –

Смежные вопросы