Не удается получить Ninject.Extensions.Interception working
Я уже много лет пытаюсь понять это. когда я пытаюсь связать свой класс с перехватчиком, я получаю следующее исключение в строке
Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();
Ошибка загрузки компонента Ninject IAdviceFactory. Такой компонент не был зарегистрирован в контейнере компонентов ядра
Я пробовал работать с LoadExtensions и без него, используя модуль для настройки привязок, и моя последняя попытка выглядит так:
internal class AppConfiguration
{
internal AppConfiguration( )
{
var settings = new NinjectSettings() { LoadExtensions = false };
Kernel = new StandardKernel(settings);
Load();
}
internal StandardKernel Kernel { get; set; }
public static AppConfiguration Instance
{
get { return _instance ?? (_instance = new AppConfiguration()); }
}
private static AppConfiguration _instance;
private void Load()
{
Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope();
Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();
}
internal static StandardKernel Resolver()
{
return Instance.Kernel;
}
}
Атрибут My Logger выглядит следующим образом
public class LogAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
return request.Context.Kernel.Get<ILoggerAspect>();
}
}
И мой перехватчик вроде этого
public class Log4NetAspect : SimpleInterceptor, ILoggerAspect
{
protected override void BeforeInvoke(IInvocation invocation)
{
Debug.WriteLine("Running " + invocation.ReturnValue);
base.BeforeInvoke(invocation);
}
public new void Intercept(IInvocation invocation)
{
try
{
base.Intercept(invocation);
}
catch (Exception e)
{
Debug.WriteLine("Exception: " + e.Message);
}
}
protected override void AfterInvoke(IInvocation invocation)
{
Debug.WriteLine("After Method");
base.AfterInvoke(invocation);
}
}
Ответы
Ответ 1
Скорее всего, вы не разворачивали Ninject.Extensions.Interception.DynamicProxy
или Ninject.Extensions.Interception.Linfu
рядом с вашим приложением [и Ninject.Extensions.Interception
]. Вы должны выбрать именно один из них.
С кодом, который у вас есть прямо сейчас (LoadExtensions=false
), он не сможет забрать конкретную библиотеку перехвата - вы должны удалить это, и нормальная загрузка добавок должна подключить расширение к ядру при создании битов перехвата чтобы поднять его.
Ответ 2
В дополнение к ответу Remo Gloor, который указал мне на добавление пакета nuget для Ninject.Extensions.Interception.DynamicProxy
, я продолжал получать то же исключение, что и OP, пока я не загрузил вручную a DynamicProxyModule
- FuncModule
также загружается вручную, чтобы обойти аналогичную ошибку с расширением factory:
_kernel = new StandardKernel(
new NinjectSettings{LoadExtensions = true},
new FuncModule(),
new DynamicProxyModule()); // <~ this is what fixed it