1

ASP.NET 핵심 환경에서 Autofac 및 EF Core를 사용하고 있습니다.객체가 아닌 객체의 속성을 자동으로 주입

내 EF 컨텍스트 :

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

문제 : 당 요청 등록

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

일부 수업 시간에, 내가 DbContext.ChangeTracker이 필요합니다. 그러나 내가 가지고있는 것은 IMyContext입니다.

인터페이스에 속성으로 추가하는 것을 원하지 않습니다. 소비자에게 너무 많은 힘을줍니다. 캡슐화를 없애는 ((DbContext)_context).ChangeTracker을 캐스팅하지 않으려합니다.

그래서 생성자에 ChangeTracker를 주입해야합니다 나는 the docs을 읽었습니다,하지만 그것을 등록하는 방법을 이해하지

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

.

(가) ChangeTracker부터 같은 것이어야 주입하는 현재의 수명 범위의 MyContext :

당신의 문맥이 상황을 해결하기 위해 할 수 있습니다 우리에게 InstancePerLifetimeScope로 람다을 레지스터의 과부하를 등록
_context.ChangeTracker.Equals(_changeTracker) 

답변

2

때문에 다음 현재 lifetimescope을 사용할 람다 changeTracker property.

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

c.Resolve<IMyContext>() 액세스

+0

캐스트는 불행하지만 필요합니다. 고마워요 시릴. – grokky

관련 문제