Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как перехватить фабрику в lightinject

Автор вопроса: YurikoEXОтветов: 1

Не знаю, что здесь делать. invocationInfo.Proceed() всегда терпит неудачу при попытке перехватить фабрику с внедрением конструктора.

var container = new ServiceContainer();
container.Register<ICool,Cool>();
container.Register<ILogger, Logger>();
container.Register<IInterceptor, LoggingInterceptor>();

//Two problem lines
container.Register<int, IAwesome>((factory, value) => new Awesome(value, factory.GetInstance<ICool>()));
container.Intercept(sr => sr.ServiceType == typeof(IAwesome), sf => sf.GetInstance<IInterceptor>());

var awesome = container.GetInstance<int,IAwesome>(100);
awesome.Yo();

терпит неудачу в этом методе в моем перехватчике.

public class LoggingInterceptor : IInterceptor
{
    private ILogger _logger;
    public LoggingInterceptor(ILogger logger)
    {
        _logger = logger;
    }
    public object Invoke(IInvocationInfo invocationInfo)
    {
        var returnValue = invocationInfo.Proceed(); //Exception here
        return returnValue;
    }
}

Исключение:

Исключение типа "System.InvalidCastException" возникло в LightInject.dll, но не было обработано в пользовательском коде.

Дополнительная информация: невозможно преобразовать объект типа "System.Func`1[ConsoleApplication1.IAwesome]" в тип "System.Object[]".

Извините, я не смог создать новый тег для Lightinject. Недостаточно представителей :/

  • Если вы закомментируете 6-ю строку, которая добавляет перехватчик, вы получите исключение? Я плохо понимаю 5-ю строку (не знаю про Lightinject), но, возможно, это не перехватчик вызывает исключение, а вы неправильно создаете экземпляр awesome переменной (я думаю, что ей нужно и число, и фабрика, вы указали только 100) . zafeiris.m 11.05.2014
  • 5-ю строку можно понять, взглянув на раздел параметров lightinject.net/#toc14. И если я закомментируйте 6-ю строку (перехватчик), инъекция работает как задумано. YurikoEX 12.05.2014

dependency-injectioninterceptoraoplight-inject

Ответы

Ответ 1 · рейтинг 8 · seesharper

Я являюсь автором LightInject, и было подтверждено, что это ошибка при перехвате экземпляров службы, которые полагаются на аргументы времени выполнения, такие как класс Awesome.

Ошибка была исправлена, и я сообщу об этом, как только будет доступен новый пакет NuGet.

С наилучшими пожеланиями

Бернхард Рихтер

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы