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

相關問題