У нас есть множественная привязка, определенная в NinjectModule
для некоторого интерфейса IInspection
, например:
private void BindCodeInspectionTypes()
{
var inspections = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(type => type.BaseType == typeof (InspectionBase));
// multibinding for IEnumerable<IInspection> dependency
foreach (var inspection in inspections)
{
var binding = Bind<IInspection>().To(inspection).InSingletonScope();
binding.Intercept().With<TimedCallLoggerInterceptor>();
binding.Intercept().With<EnumerableCounterInterceptor<InspectionResultBase>>();
}
}
Таким образом, типы прокси-перехватчиков будут для IInspection
. Однако некоторые типы inspection
реализуют интерфейс IParseTreeInspection
, который расширяет IInspection
:
public interface IParseTreeInspection : IInspection
{
ParseTreeResults ParseTreeResults { get; set; }
}
Проблема, которую это создает, заключается в том фрагменте кода, который потребляет перехватчики — внедренные прокси-типы по понятным причинам ничего не знают о IParseTreeInspection
, поэтому этот цикл foreach
не повторяется ни разу:
var enabledParseTreeInspections = _inspections.Where(inspection =>
inspection.Severity != CodeInspectionSeverity.DoNotShow
&& inspection is IParseTreeInspection);
foreach (var parseTreeInspection in enabledParseTreeInspections)
{
(parseTreeInspection as IParseTreeInspection).ParseTreeResults = parseTreeWalkResults;
}
Есть ли способ, которым я могу мульти-связать IInspection
(т.е. конструктор-внедрить IEnumerable<IInspection>
) и по-прежнему иметь возможность сообщать экземплярам IParseTreeInspection
, когда Ninject внедряет перехватчики?