1

J'utilise Autofac et EF Core, dans un environnement ASP.NET Core.Injection Autofac de la propriété d'un objet plutôt que de l'objet

Mon EF contexte:

public interface IMyContext { /* ... */ } 
public class MyContext : DbContext, IMyContext { /* ... */ } 

qui est enregistré par demande:

builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope(); 

Problème: dans une classe, j'ai besoin DbContext.ChangeTracker. Cependant ce que j'ai est IMyContext.

Je ne veux pas l'ajouter en tant que propriété à l'interface (qui donne trop de puissance aux consommateurs), et je ne veux pas lancer ((DbContext)_context).ChangeTracker (qui détruit l'encapsulation).

Je dois donc injecter un ChangeTracker dans le constructeur:

public Foo(IMyContext context, ChangeTracker changeTracker) 
{ 
    _context = context; 
    _changeTracker = changeTracker; 
} 

J'ai lu the docs, mais ne comprends pas comment enregistrer.

injecté ChangeTracker doit être le même que celui de la durée de vie étendue de MyContext actuelle:

_context.ChangeTracker.Equals(_changeTracker) 

Répondre

2

Parce que votre contexte est enregistré comme InstancePerLifetimeScope, vous pouvez nous une surcharge du registre qui prennent un lambda pour résoudre le contexte et alors accéder au changeTracker property.

builder.Register(c => ((DbContext)c.Resolve<IMyContext>()).ChangeTracker) 
     .As<ChangeTracker>() 
     .InstancePerLifetimeScope(); 

la c.Resolve<IMyContext>() du lambda utilisera le courant lifetimescope

+0

La distribution est malheureuse mais nécessaire. Merci Cyril. – grokky