1

큰 응용 프로그램을위한 핵심 서비스를 구축하고 성 윈저에서 자동 팩로 전환했습니다. 자동 스캐닝과 모듈을 사용하는 자동 등록 승인에서는 모든 것이 잘 작동하지만 latelly interesting 경우가 있습니다. 하나의 인터페이스와 autofac의 2 가지 구현이 비즈니스의 관점에서 잘못 구현 된 임의 순서대로 등록합니다. 물론 수작업으로 수동으로 등록 할 수는 있지만 IContainer 레벨에 대한 유효성을 검사하여 적어도 하나의 등록 된 서비스에 대한 출력 정보를 제공하는 것이 좋을 것입니다. 그리고 하나 이상의 구현이있는 경우 기본값으로 표시해야합니다. 해결 방법을 사용하여 컨테이너에 요청할 때 해결됩니다. 이 목적은 개발자가 여러 가지가 있지만 자동 등록을 유지할 때 특정 구체화를 등록하도록 강제하는 것입니다.
이 케이스로가는 길을 찾았습니까?자동 팩스 등록 확인

+0

오늘은 코드가 유지 GitHub의 개발자에 같은 queation을 요청하지만 반응은 "너무 많은 코어 클래스에 영향을 미칠 수 있기 때문에이 기본 API에 포함되지 않습니다"입니다 :(그래서 힌트는 당신을 위해 거기 리플렉션을 사용하고 사설 구조와 필드에 액세스하고 공식 API를 사용하여 간단한 솔루션을 구축하는 데 적어도 2 건의 승인이 있습니다. – Macko

+0

나가는 정보가 이해되는 한, 어쩌면해야 할 일은 정확하지 않을 수도 있습니다. [Autofac issue # 853] (https://github.com/autofac/Autofac/issues/853)에 설명 된 이유 –

+0

감사합니다. Travis, 저는 이미 IContainer에 대한 등록 방법을 간단하게 작성하고 쉽게 확장 할 수있는 방법을 준비했습니다. 간단한 등록의 경우 작동하는 것처럼 보입니다. 코드를 사용하도록하겠습니다. 더 복잡한 등록을 관리하는지 확인하십시오. – Macko

답변

0
public static class AutofacExtensions 
{ 
    /// <summary> 
    /// Checks if one implementation was chosen by developer for every interface 
    /// </summary> 
    /// <param name="container"></param> 
    public static void ValidateRegistrations(this IContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException(nameof(container)); 
     } 

     var registrations = GetRegistrations(container); 
     Validate(registrations); 
    } 

    static void Validate(IDictionary<Type, IList<Type>> registrations) 
    { 
     foreach (var registration in registrations.OrderBy(x => x.Key.FullName)) 
     { 
      var unique = registration.Value.Distinct().Count(); 

      if (unique > 1) 
      { 
       var all = registration.Value.Count; 

       if (all <= unique) 
       { 
        var currentImplementations = registration.Value.Distinct().Select(x => x.FullName); 
        var aggregatedImplementations = string.Join(", ", currentImplementations); 

        throw new InvalidOperationException($"IoC/DI: for type '{registration.Key.FullName}' was not chose default implementation! Registered available implementations: {aggregatedImplementations}"); 
       } 
      } 
     } 
    } 

    static IDictionary<Type, IList<Type>> GetRegistrations(IContainer container) 
    { 
     var registrations = new Dictionary<Type, IList<Type>>(); 

     foreach (var registration in container.ComponentRegistry.Registrations) 
     { 
      foreach (var service in registration.Services.OfType<IServiceWithType>().Where(x => x.ServiceType.Namespace != null && x.ServiceType.Namespace.ToLowerInvariant().StartsWith("flb."))) 
      { 
       IList<Type> implementations; 

       if (!registrations.TryGetValue(service.ServiceType, out implementations)) 
       { 
        implementations = new List<Type>(); 
        registrations[service.ServiceType] = implementations; 
       } 

       implementations.Add(registration.Activator.LimitType); 

      } 
     } 

     return registrations; 
    } 

}