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 есть запрос на получение, который включает это изменение как часть остальных изменений.