2014-02-10 4 views
0

에 따라 우리는 다음과 같습니다 표준 클래스가 있습니다. 이것은 재정의하려는 구성 요소이지만 특정 네임 스페이스의 서비스에 대해서만 입니다. 이것은 나의 처음 시도였습니다.Autofac 주입 변경 구성 요소는 오브젝트 트리

builder.RegisterAssemblyTypes(typeof(OurObjectContext).Assembly) 
    .InNamespace("Company.Core.Services") 
    .AsImplementedInterfaces() 
    .InstancePerHttpRequest() 
    .WithParameter(new ResolvedParameter((parameterInfo, componentContext) => 
    {   
     return true; 

    }, (parameterInfo, componentContext) => 
    { 
     return null; 
    })); 

그러나 이것은 서비스를위한 것이지 저장소가 아닙니다. Autofac에 "이 서비스를 만들 때, 작성한 각 저장소에 대해 보통의 객체 컨텍스트 대신 그 객체 컨텍스트를 사용하길 원합니다"라고 말하면 어떻게됩니까?

어떻게하면됩니까? 나는 올바른 길을 가고 있는가?

+0

이 평균 왜 당신은 단지 조건이 작업을 수행하고 싶어 '나는 오버라이드 (override) 할 구성 요소를'무엇을? – Steven

답변

1

예, 가까운 사이입니다. 여기 모습 수있는 방법에 대한 의견이있는 샘플 코드는 다음과 같습니다

builder.RegisterAssemblyTypes(typeof(OurObjectContext).Assembly) 
    .InNamespace("Company.Core.Services") 
    .AsImplementedInterfaces() 
    .InstancePerHttpRequest() 
    .WithParameter(new ResolvedParameter((parameterInfo, componentContext) => 
    { 
     // in predicate we select only IRepository<> types 
     return parameterInfo.ParameterType.GetGenericTypeDefinition() == typeof(IRepository<>); 

    }, (parameterInfo, componentContext) => 
    { 
     // firstly we get a generic parameter type 
     var genericArgument = parameterInfo.ParameterType.GetGenericArguments()[0]; 
     // then we construct a new generic type with the parameter, suppose it's LoggingRepository<> and it's registered 
     var typeToResolve = typeof(LoggingRepository<>).MakeGenericType(genericArgument); 

     // resolve the type and Autofac will put it instead of IRepository<> 
     return componentContext.Resolve(typeToResolve); 
    })); 
+0

환상적입니다. – Amy