2012-05-14 2 views
2

Я только что обновил решение от .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?

ответ

0

Ok Давайте возобновить мой разговор с Крейгом Neuwirt в списке рассылки замок:

  • поведение изменилось, в v2.5 это падало обратно на преходящей жизни. Но так как это было непротиворечиво (Нет информации о том, когда был компонентом PerWcfOperation, а когда он был Transient), это удалило .
  • Это можно сделать то же самое, используя пользовательский образ жизни области действия аксессор

Я не буду размещать свой код здесь, как это тривиально, как только вы читали, как Гибридный образ жизни сделаны в проекте castlecontrib

1

Я не верю, что OperationContext.Current доступен в том месте, где вызывается пользовательский UserNamePasswordValidator. Можно ли использовать другой образ жизни для этого компонента?

Смежные вопросы