Autofac注入对象的属性而不是对象

时间:2017-04-01 14:09:07

标签: .net entity-framework asp.net-core autofac entity-framework-core

我在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)

1 个答案:

答案 0 :(得分:2)

因为您的上下文已注册为InstancePerLifetimeScope,您可以使用lambda来解析上下文,然后访问changeTracker property.

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

lambda的c.Resolve<IMyContext>()将使用当前的lifetimescope