Castle Windsor Удобства, в которых Нэнси Виндзор не работает

У меня странная проблема при попытке обновить Nancy 0.7 до 0.12. Ранее я регистрировал средство для ведения журналов для всех моих служб в моем загрузчике:

    protected override void ConfigureApplicationContainer(IWindsorContainer existingContainer)
    {
        existingContainer.AddFacility<LoggingFacility>();
        existingContainer.Register(Component.For<LoggingInterceptor>());
        ...other registration
    }

LoggingFacility выглядит так:

public class LoggingFacility : AbstractFacility 
{
    protected override void Init() { Kernel.ComponentRegistered += KernelComponentRegistered; }

    static void KernelComponentRegistered(string key, IHandler handler)
    {
        if (!ShouldProxyComponent(handler))
            return;

        // Don't add more than one logging interceptor to a component
        handler.ComponentModel.Interceptors.AddIfNotInCollection(InterceptorReference.ForType<LoggingInterceptor>());
    }

    static bool ShouldProxyComponent(IHandler handler)
    {
        //Don't log interceptors themselves
        if (typeof(IInterceptor).IsAssignableFrom(handler.ComponentModel.Implementation)) 
            return false;

        //Don't put proxy around any late-bound (usually factory-created) component
        if (handler.ComponentModel.Implementation == typeof(LateBoundComponent))
            return false;

        return true;
    }
}

К сожалению, начиная с версии 0.12/Castle 3.1, следующая строка WindsorNancyBootstrapper.RegisterTypes вызывает некоторые проблемы

        container.Register(Component.For<Func<IRouteCache>>()
            .UsingFactoryMethod(ctx => (Func<IRouteCache>) (ctx.Resolve<IRouteCache>)));

По сути, Касл пытается создать динамический прокси вокруг Func. Это было бы хорошо, если бы эта регистрация вызвала событие, на которое подписался мой объект, но это не так. И все же перехватчик, похоже, все равно зарегистрирован.

При попытке создать прокси, очевидно, происходит сбой, потому что MulticastDelgate (родительский объект IL для Func<>) запечатан: TypeLoadException Не удалось загрузить тип 'Castle.Proxies.Func`1Proxy' из сборки 'DynamicProxyGenAssembly2, Версия =0.0.0.0, Culture= нейтральный, PublicKeyToken=a621a9e7e5c32e69', поскольку родительский тип закрыт.

Я не уверен, что здесь делать, у кого-нибудь есть опыт работы с объектами и Нэнси 0,12?

1 ответ

Оказалось, что для меня решение было зарегистрировать Castle TypedFactoryFacility как часть моего переопределения загрузчика Нэнси:

existingContainer.AddFacility<TypedFactoryFacility>();

В Nancy.Bootstrappers.Windsor есть запрос на получение, который включает это изменение как часть остальных изменений.

Другие вопросы по тегам