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;
}
}
오늘은 코드가 유지 GitHub의 개발자에 같은 queation을 요청하지만 반응은 "너무 많은 코어 클래스에 영향을 미칠 수 있기 때문에이 기본 API에 포함되지 않습니다"입니다 :(그래서 힌트는 당신을 위해 거기 리플렉션을 사용하고 사설 구조와 필드에 액세스하고 공식 API를 사용하여 간단한 솔루션을 구축하는 데 적어도 2 건의 승인이 있습니다. – Macko
나가는 정보가 이해되는 한, 어쩌면해야 할 일은 정확하지 않을 수도 있습니다. [Autofac issue # 853] (https://github.com/autofac/Autofac/issues/853)에 설명 된 이유 –
감사합니다. Travis, 저는 이미 IContainer에 대한 등록 방법을 간단하게 작성하고 쉽게 확장 할 수있는 방법을 준비했습니다. 간단한 등록의 경우 작동하는 것처럼 보입니다. 코드를 사용하도록하겠습니다. 더 복잡한 등록을 관리하는지 확인하십시오. – Macko