我在ASP.NET Core环境中使用Autofac和EF Core。
我的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)
答案 0 :(得分:2)
因为您的上下文已注册为InstancePerLifetimeScope
,您可以使用lambda来解析上下文,然后访问changeTracker property.
builder.Register(c => ((DbContext)c.Resolve<IMyContext>()).ChangeTracker)
.As<ChangeTracker>()
.InstancePerLifetimeScope();
lambda的c.Resolve<IMyContext>()
将使用当前的lifetimescope