Аспектно-ориентированное программирование с StructureMap.DynamicInterception
Я реализовал консольное приложение, которое использует DynamicInterception на карте структуры, я следую примеру на странице http://structuremap.github.io/dynamic-interception/. Сейчас я пытаюсь передать код на сайт asp.net MVC, но я получаю следующую ошибку
Декоратор Перехватчик вышел из строя во время строительства объекта. Смотрите внутреннее исключение:
1.) DynamicProxyInterceptor для ITSector.Site.Core.Controllers.HomeController с режимами перехвата: ITSector.Library.Aspect.LoggerInterceptor 2.) ITSector.Site.Core.Controllers.HomeController 3.) Экземпляр ITSector.Site.Core.Core.Core.Core.Core.Core.Core.Core.HomeController 4.) Container.GetInstance(ITSector.Site.Core.Controllers.HomeController)
Внутреннее исключение: указанный тип не является интерфейсом. Имя параметра: interfaceToProxy с трассировкой стека:
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, Object target, ProxyGenerationOptions options, IInterceptor[] interceptors)
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget[TInterface](TInterface target, IInterceptor[] interceptors)
at lambda_method(Closure , IBuildSession , IContext )
Я использую Nuget Structure.MVC5.Update в качестве Решателя зависимостей. Может ли кто-нибудь дать мне подсказку о том, как реализовать его для перехвата вызовов методов контроллера.
Благодарю.
1 ответ
StructureMap ожидает интерфейс в For<T>()
метод, но вы передаете это HomeController
, который является конкретным классом.
У вас есть несколько вариантов, чтобы заставить его работать. Вы можете прикрепить свой LoggerInteceptor
для всех контроллеров с For<IController>()
, Если вы хотите подключить регистратор только к некоторым вашим контроллерам, вы можете создать новый интерфейс специально для зарегистрированных контроллеров, например For<ILoggedController>()
и убедитесь, что нужные контроллеры наследуются от ILoggedController.