여기에 뭔가 잘못 이해할 수 있으므로 여기에 간단한 대답이있을 수 있지만 현재 내 머리를 긁적니다.Autofac - 구성 요소가 수명 범위에 정의 된 종속성을 무시합니다.
IUnitOfWork를 구현하는 UnitOfWork 클래스가 있습니다 (예, 알고 있습니다). 작업 단위 (UOW)의 생성자는 IPrincipalFactory를 사용합니다. TResponder는 IUnitOfWork를 취하는 그래프의 최상위 레벨입니다.
ApplicationPrincipalFactory를 평생 범위의 특정 인스턴스로 등록하려고합니다 ... HandleAsync 함수에 전달 된 일부 속성에 따라 다릅니다. 내가하고 있어요 다음
모든 것을 바탕으로public async Task<TResponse> HandleAsync<TMessage, TResponse, TResponder>(TMessage message)
where TMessage : class
where TResponder : IRespondAsync<TMessage, TResponse>
{
using (var scope = this.BeginLifetimeScope(message))
{
var responder = scope.Resolve<TResponder>();
return await responder.Respond(message);
}
}
private ILifetimeScope BeginLifetimeScope<TMessage>(TMessage message)
{
var unwrapped = GetDomainContext(message);
var applicationPrincipalFactory = this.CreateApplicationPrincipalFactory(unwrapped);
var lifetime = this.container.BeginLifetimeScope(
r => r.RegisterInstance(applicationPrincipalFactory).As<IPrincipalFactory>());
return lifetime;
}
private ApplicationPrincipalFactory CreateApplicationPrincipalFactory(IDomainContext unwrapped)
{
var applicationPrincipalFactory =
new ApplicationPrincipalFactory(
unwrapped.Tenant,
unwrapped.ActingTenant,
unwrapped.Username);
return applicationPrincipalFactory;
}
I했습니다 읽고, BeginLifetimeScope 내에서 종속성을 정의 (R => 바인딩 부모 컨테이너를 오버라이드 (override) 할 필요가 그래서, 그것은해야 모든 슬롯 결의를 호출 할 때 깔끔하게 함께 . 그러나
, 나는 예외가 얻을 :.
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Platform.Engine.Persistence.UnitOfWork' can be invoked with the available services and parameters: Cannot resolve parameter 'Platform.Engine.Security.IPrincipalFactory principalFactory' of constructor
나는이 방법에 비해 어디 다른 IPrincipalFactory를 등록하고 있지 않다을 다음과 같이 IUnitOfWork는 외부 범위에 정의되어
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
나는 또한 문제의 원인은 평생 한 것이 아니라 외부 용기에 등록하여 경우에 자식 컨테이너 내에서 UnitOfWork에 등록이되었다 다시 정의하는 시도
:
var lifetime = this.container.BeginLifetimeScope(
r => r.RegisterInstance(applicationPrincipalFactory).As<IPrincipalFactory>());
var overrides = new ContainerBuilder();
overrides.RegisterType<UnitOfWork>().As<IUnitOfWork>();
overrides.Update(lifetime.ComponentRegistry);
return lifetime;
아니에요 내가 누락 된 것이 무엇인지 ... 어떤 생각이나 제안?
'IPrincipalFactory'에 대해'builder.RegisterType' 라인이 있습니까? – DavidG
나는 ... RegisterInstance (...)를 사용하지 않을 것입니다.가 여기에서 작동하지 않으므로? –
잘 모르겠지만 Autofac을 사용하지는 않았지만 추측하고있는 오류 메시지를 기반으로합니다. 나는 보통 빌더를 사용하여 각 유형을 등록하고 나머지는 Autofac이 처리하도록합니다. – DavidG