2011-02-18 2 views

답변

6

등록되지 않은 콘크리트 유형을 컨테이너에서 해결할 수있는 또 다른 방법입니다. 모든 autofac 생성자가 논리를 찾고 선택하면 모든 등록 이벤트 핸들러가 그대로 유지됩니다.

public static object ResolveUnregistered(this IComponentContext context, Type serviceType, IEnumerable<Parameter> parameters) 
    { 
     var scope = context.Resolve<ILifetimeScope>(); 
     using (var innerScope = scope.BeginLifetimeScope(b => b.RegisterType(serviceType))) 
     { 
      IComponentRegistration reg; 
      innerScope.ComponentRegistry.TryGetRegistration(new TypedService(serviceType), out reg); 

      return context.ResolveComponent(reg, parameters); 
     } 
    } 

아이디어는 당신이 파생 된 상황에서 구성 요소 등록을 취득하고 현재의 상황에서이를 해결한다는 것입니다 :

첫째, 당신은이 방법을 정의합니다. 그런 다음 몇 가지 편리한 오버로드를 만들 수 있습니다.

public static object ResolveUnregistered(this IComponentContext context, Type serviceType) 
    { 
     return ResolveUnregistered(context, serviceType, Enumerable.Empty<Parameter>()); 
    } 

    public static object ResolveUnregistered(this IComponentContext context, Type serviceType, params Parameter[] parameters) 
    { 
     return ResolveUnregistered(context, serviceType, (IEnumerable<Parameter>)parameters); 
    } 

    public static TService ResolveUnregistered<TService>(this IComponentContext context) 
    { 
     return (TService)ResolveUnregistered(context, typeof(TService), Enumerable.Empty<Parameter>()); 
    } 

    public static TService ResolveUnregistered<TService>(this IComponentContext context, params Parameter[] parameters) 
    { 
     return (TService)ResolveUnregistered(context, typeof(TService), (IEnumerable<Parameter>)parameters); 
    } 
+0

만약'serviceType'이'IDisposable'을 구현하고'innerScope'가 폐기되면 어떤 일이 일어날 지 궁금합니다 ... –

+0

@WouterHuysentruit'innerScope'는 해당 범위에서 해결 된 서비스 인스턴스 만 처리하지만이 경우 서비스는 부모로부터 해결됩니다 'context' 범위. – Ilya

+0

그러나이 솔루션은 부모 ComponentRegistry가 어떻게 든 자식 레지스트리에서 이루어진 유형 등록에 대한 참조를 보유하는 경우 일부 누수가 발생할 수 있습니다. – Ilya

3

맞춤 코드가 필요한 해결책을 찾았습니다. Somethings는 내 앱에만 한정되어 있지만 사진을 얻을 수 있다고 생각합니다.

Resolve (parameter.ParameterType)는 컨테이너에 대한 호출입니다.