Я только что обновил решение от .NET 3.5 до .NET 4 В то же время я обновил все внешние библиотеки до последней версии, поэтому теперь Castle обновлен с 2,5. 2 v3.0ComponentResolutionException после обновления до замка 3.0
Я некоторый код, регистрация доступа к БД, что бросить теперь исключение, когда я пытаюсь решить:
[Castle.MicroKernel.ComponentResolutionException] { "не удалось получить возможности для компонент DF.MailFlowAdapter. Это, скорее всего, ошибка в пользовательском IScopeAccessor или вы пытаетесь Доступ к области действия компонент вне сферы (как на веб-запроса-компонент снаружи веб-запроса и т.д.) "} Castle.MicroKernel.ComponentResolutionException
Компонент зарегистрирован таким образом:
Container
.AddFacility<WcfFacility>()
.AddFacility<DataAccessAdapterFacility>()
.Register(Component
.For<SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter>()
.ImplementedBy<MailFlowAdapter>()
.LifeStyle.PerWcfOperation())
Проблема возникает из PerWcfOperation LifeStyle, но я не знаю, почему: Проект является проектом WCF, и компонент разрешен при вызове метода WCF. Эта регистрация отлично работает в отрасли, использующей Castle 2.5.
Исключение возникает при проверке wcf login/pwd (в IAuthorizationPolicy, которая использует UserNamePasswordValidator), потому что я разрешаю IDataAccessAdapter (чтобы проверить логин/pwd в db).
Другая часть информации:
DataAccessAdapterFacility старый код, зарегистрировать компонент активатора, мне пришлось немного изменить код, потому что де model.Service изменен model.Services:
void Kernel_ComponentModelCreated(ComponentModel model)
{
foreach (var service in model.Services)
{
if (service == typeof(SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter))
{
model.CustomComponentActivator = typeof(DataAccessAdapterActivator);
}
}
}
И DataAccessAdapterActivator имеет в обязанности для того чтобы создать объект, используя строку соединения в конфигурационном файле:
protected override object InternalCreate(CreationContext context)
{
var connectionString = string.Empty;
if (ConfigurationManager.ConnectionStrings["Main"] != null)
connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
return new MailFlowAdapter(connectionString);
}
Я думаю, треска e с DataAccessAdapterFacility/DataAccessAdapterActivator можно упростить с помощью Factory, но здесь это не вопрос :)
У кого-то есть идея, почему я не могу использовать стиль жизни PerWcfOperation?