1

我在ASP.NET Core环境中使用Autofac和EF Core。Autofac注入对象的属性而不是对象

我的EF背景:

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

这是每个请求注册:

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

问题:在某些类,我需要DbContext.ChangeTracker。然而我所拥有的是IMyContext

我不想将它作为一个属性添加到接口(这给消费者提供了太多的权力),并且我不想投射((DbContext)_context).ChangeTracker(即破坏封装)。

所以我必须注入ChangeTracker到构造函数:

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

我读过the docs,但不知道如何进行注册。

注入ChangeTracker必须来自同一个的当前生存范围的MyContext

_context.ChangeTracker.Equals(_changeTracker) 

回答

2

因为你的情况下被注册为InstancePerLifetimeScope你可以我们采取一个lambda寄存器的过载,以解决环境和然后访问changeTracker property.

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

的拉姆达的c.Resolve<IMyContext>()将使用当前lifetimescope

+0

演员不幸,但必要。谢谢Cyril。 – grokky