2012-05-07 3 views
3

그래서 현재 저희 회사의 Autofac을 테스트 중입니다.두 개 이상의 암시가있는 인터페이스를 등록하지 않으시겠습니까

우리는 다음과 같은 규칙을 가지고 싶습니다 인터페이스는 한 번만 구현 된

  1. 경우, 자동으로 builder.RegisterAssemblyTypes (아래 참조)를 사용하여 추가 할 수 있습니다.

  2. 그렇지 않으면 어떤 구현이 '기본'구현인지 결정하는 규칙을 수동으로 작성해야합니다. 그것은 작동하고, 지금

    var builder = new ContainerBuilder(); 
    builder.RegisterAssemblyTypes(Assembly 
        .Load("Lunch.Service")).As(t => t.GetInterfaces()[0]); 
    builder.RegisterType<ConsoleLoggerService>() 
        .As<ILoggerService>().SingleInstance(); 
    builder.RegisterModule(new DestinationModule()); 
    builder.RegisterType<TransportationService>() 
        .As<ITransportationService>().PropertiesAutowired(); 
    

    ,하지만 첫 번째 구현이며, 자동으로 생성됩니다 어떤 결정 :

나는 다음과 같은 코드가 있습니다. 우리는 수동 프로세스를 만들고 싶습니다. 수동으로 '규칙'을 작성하지 않으면 오류가 발생합니다. 이것이 가능한가?

답변

1

은 당신이 뭔가를 할 수 있습니다 :

cb.RegisterAssemblyTypes(assembly).Where(type => 
{ 
    var implementations = type.GetInterfaces(); 

    if (implementations.Length > 0) 
    { 
     var iface = implementations[0]; 

     var implementers = 
      from t in assembly.GetTypes() 
      where t.GetInterfaces().Contains(iface) 
      select t; 

     return implementers.Count() == 1; 
    } 

    return false; 
}) 
.As(t => t.GetInterfaces()[0]); 

이것은 단지 하나의 구현이 존재하는 모든 구현을 등록하고, 사용자가 수동으로 등록 할 수 있도록 여러 구현과 인터페이스를 무시합니다. 이것이 어떤면에서 효율적이라고 주장하지는 않습니다 (서비스의 수에 따라, 예를 들어 캐싱 구현자를보고 싶을 수도 있습니다).

+0

"어떤 방식 으로든 효율적이라고 주장하지 않습니다." 등록 단계의 성능이 문제가되는 일은 거의 없었으며 어셈블리의 모든 유형을 반복하는 것은 일반적으로 상당히 빠르다. 이 코드는 런타임 성능 (인스턴스 분석에 걸리는 시간)에 부정적인 영향을 미치지 않으므로 아무런 문제가 없어야합니다. 덕분에 – Steven

+0

. 나는 이것을 조사 할 것이다. 유스 케이스가 합리적인지 궁금합니다. 기본적으로, 우리는 때때로 많은 일들에 관한 문제를 가지고 있습니다. 우리는 때로는 상황이 어떻게되는지 알지 못하기 때문에 잘못된 수업이 주입되기 때문입니다. 그래서 이것은 하나가있는 모든 것을 기본값으로 만들 것이고, 둘 이상이 있다면 우리는 수동으로 케이스를 생성해야합니다. – Cyfer13

+0

여러 구현자를 찾을 수있는 합법적 인 이유가 있습니까? 아니면 배수를 찾는 것이 실제로 오류 조건입니까? 정말로 오류이거나 예상치 못한 상황 인 경우 아마도 여러 가지 구현이 발견 될 때 예외를 던지거나 오류를 기록해야합니다 (실제로는 없어야하는 어셈블리에 대한 참조가 있음을 의미 할 수 있음). 배포)? 아니면 실제로 여러 구현을 사용할 수 있으며 구성을 기반으로 수동으로 선택해야합니까? 후자라면 이것이 합리적인 사용 사례처럼 보입니다. –

관련 문제