2016-05-25 37 views
5

Potrzebuję pomocy w zrozumieniu Jedności i pracy MKOl.Web API z Unity IOC - Jak rozwiązano moją zależność DBContext Dependecy?

mam to w moim UnityContainer

var container = new UnityContainer(); 

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

config.DependencyResolver = new UnityResolver(container); 

Wtedy w moim kontrolera API Web, rozumiem, że IService jest wstrzykiwany przez Unity ponieważ był zarejestrowanym typu.

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

Moja Interfejs usługi

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

Moje Wykonanie usługi posiada własny konstruktor, że trwa obiekt 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

Najprawdopodobniej 'MyDbContext' ma konstruktor bez parametrów. Jedność może rozwiązać konkretne klasy bez rejestracji. –

Odpowiedz

2

Powodem jest to, że pracuje MyDbContext ma konstruktora bez parametrów (lub ma konstruktora, który zawiera parametry, które można rozwiązać) jedność, jedność i dlatego domyślnie można rozwiązać konkretne typy bez rejestracji.

Cytując this reference:

Podczas próby rozwiązania non-odwzorowany klasę betonu, który nie ma rejestracji pasujący do pojemnika, Unity będzie utworzyć wystąpienie tej klasy i wypełniać żadnych zależności.

Należy również zrozumieć pojęcie automatycznego okablowania.

Gdy kontener próbuje rozwiązać MyController, wykrywa, że ​​musi rozwiązać IService, który jest mapowany na Service. Kiedy kontener próbuje rozwiązać Service, wykrywa, że ​​musi rozwiązać MyDbContext. Proces ten jest nazywany automatycznym okablowaniem i jest wykonywany rekursywnie, dopóki nie zostanie utworzony cały wykres obiektu.

+1

To jest jakaś szalona czarna magia! Było to bardzo jasne wyjaśnienie. Dziękuję Ci. – duyn9uyen

+1

Nie ma za co. [Niezbyt dobra magia w mojej opinii] (http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/). –