2016-05-25 22 views
5

Ho bisogno di aiuto per capire l'unità e come funziona lo IOC.API Web con Unity IOC: come viene risolta la dipendenza da DBContext?

ho questo nel mio UnityContainer

var container = new UnityContainer(); 

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

config.DependencyResolver = new UnityResolver(container); 

Poi, nel mio controller API Web, capisco che IService viene iniettato da Unity perché era un tipo registrato.

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

Il mio Service Interface

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

mio servizio di implementazione ha il suo costruttore che prende un oggetto 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

Probabilmente 'MyDbContext' ha un costruttore senza parametri. L'unità può risolvere classi concrete senza registrazione. –

risposta

2

La ragione per cui sta lavorando è che MyDbContext ha un costruttore senza parametri (o ha un costruttore che contiene i parametri che l'unità può risolvere), e perché l'unità di default in grado di risolvere i tipi di cemento senza registrazione.

Citando this reference:

Quando si tenta di risolvere una classe non-mapped concreta che non dispone di una registrazione corrispondente nel contenitore, Unità sarà creare un'istanza di quella classe e popolare eventuali dipendenze.

È inoltre necessario comprendere il concetto di cablaggio automatico.

Quando il contenitore tenta di risolvere MyController, rileva che deve risolvere IService che è mappato su Service. Quando il contenitore tenta di risolvere Service, rileva che deve risolvere MyDbContext. Questo processo è denominato auto-wiring e viene eseguito in modo ricorsivo finché non viene creato l'intero grafico dell'oggetto.

+1

Ecco una pazza magia nera lì! Questa è stata una spiegazione molto chiara. Grazie. – duyn9uyen

+1

Prego. [Magia non molto buona secondo me] (http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/). –