Виндзорский контейнер: как заставить утилизировать объект?

Думаю, я бы поделился этим кодом. Это довольно просто, но эффективно. Он обрабатывает разделенные запятыми файлы скобками. Вы можете легко изменить его в соответствии с вашими потребностями.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char *argv[])
{
  //argv[1] path to csv file
  //argv[2] number of lines to skip
  //argv[3] length of longest value (in characters)

  FILE *pfinput;
  unsigned int nSkipLines, currentLine, lenLongestValue;
  char *pTempValHolder;
  int c;
  unsigned int vcpm; //value character marker
  int QuotationOnOff; //0 - off, 1 - on

  nSkipLines = atoi(argv[2]);
  lenLongestValue = atoi(argv[3]);

  pTempValHolder = (char*)malloc(lenLongestValue);  

  if( pfinput = fopen(argv[1],"r") ) {

    rewind(pfinput);

    currentLine = 1;
    vcpm = 0;
    QuotationOnOff = 0;

    //currentLine > nSkipLines condition skips ignores first argv[2] lines
    while( (c = fgetc(pfinput)) != EOF)
    {
       switch(c)
       {
          case ',':
            if(!QuotationOnOff && currentLine > nSkipLines) 
            {
              pTempValHolder[vcpm] = '\0';
              printf("%s,",pTempValHolder);
              vcpm = 0;
            }
            break;
          case '\n':
            if(currentLine > nSkipLines)
            {
              pTempValHolder[vcpm] = '\0';
              printf("%s\n",pTempValHolder);
              vcpm = 0;
            }
            currentLine++;
            break;
          case '\"':
            if(currentLine > nSkipLines)
            {
              if(!QuotationOnOff) {
                QuotationOnOff = 1;
                pTempValHolder[vcpm] = c;
                vcpm++;
              } else {
                QuotationOnOff = 0;
                pTempValHolder[vcpm] = c;
                vcpm++;
              }
            }
            break;
          default:
            if(currentLine > nSkipLines)
            {
              pTempValHolder[vcpm] = c;
              vcpm++;
            }
            break;
       }
    }

    fclose(pfinput); 
    free(pTempValHolder);

  }

  return 0;
}
11
задан George Mauer 17 September 2008 в 17:54
поделиться

3 ответа

Это - что-то, что я думаю, что люди действительно не знают при работе с Виндзорским контейнером - особенно часто удивительное поведение, на которое сохранены доступные переходные компоненты контейнером в течение времени жизни ядра, пока это не расположено, если Вы не выпускаете их сами - хотя это документируется - смотрят здесь - но быстро заключить в кавычки:

MicroKernel имеет сменную политику выпуска, которая может поднять трубку и реализовать некоторую маршрутизацию для расположения компонентов. MicroKernel идет с тремя реализациями IReleasePolicy:

  • AllComponentsReleasePolicy: отследите все компоненты для осуществления корректного распоряжения на распоряжение экземпляра MicroKernel
  • LifecycledComponentsReleasePolicy: только отследите компоненты, которые имеют списывать связанный жизненный цикл
  • NoTrackingReleasePolicy: не выполняет отслеживания

Можно также проводить собственную политику выпуска при помощи интерфейса IReleasePolicy.

То, что Вы могли бы найти легче, должно изменить политику на NoTrackingReleasePolicy и затем обработать расположение себя - это потенциально опасно также, но если Ваши образы жизни являются в основном переходными (или если, когда Ваш контейнер расположен, Ваше приложение собирается закрыться так или иначе), это - вероятно, не грандиозное предприятие. Помните однако, что любые компоненты, которые были уже введены с одиночным элементом, будут содержать ссылку, таким образом, Вы могли закончить тем, что вызвали проблемы, пытающиеся "обновить" Ваши одиночные элементы - он походит на плохую практику и интересно, можно ли, возможно, избежать необходимости делать это во-первых путем улучшения способа, которым соединяют приложения.

Другие подходы должны создать пользовательский жизненный цикл со своим собственным, списывают реализацию (настолько выпускающий одиночный элемент, на самом деле избавился бы от компонента, во многом как переходный жизненный цикл делает).

Кроме того, другой подход должен иметь декоратора для Вашего сервиса, зарегистрированного в контейнере в одноэлементном образе жизни, но Ваш фактический базовый сервис, зарегистрированный в контейнере в переходном образе жизни - затем, когда необходимо обновить компонент просто, избавляется от переходного базового компонента, сохраненного декоратором, и заменяет его недавно разрешенным экземпляром (разрешите его с помощью ключа компонентов, скорее затем сервис, чтобы не получать декоратора) - это избегает проблем с другими одноэлементными сервисами (которые "не обновляются") от содержания на устаревшие сервисы, которые были расположены создания их неприменимый, но действительно требует, чтобы немного кастинга и т.д. заставило его работать.

13
ответ дан 3 December 2019 в 07:14
поделиться

Хорошо, таким образом, я запускал тесты, и это походит Container.Release() Неявно вызовет IDisposable's Dispose() метод для выполнения, только если образ жизни является Переходным (это, вероятно, не точно корректно, но точка, - то, что это, привычка' делает проклятую вещь, если образ жизни является одиночным элементом).

Теперь, если Вы звоните Container.Dispose() это назовет доступные методы также, хотя, к сожалению, это избавится от целого ядра, и необходимо будет включить все компоненты назад:

var container = new WindsorContainer();
container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton);
var obj = container.Resolve<MyDisposable>();  // Create a new instance of MyDisposable
obj.DoSomething();
var obj2 = container.Resolve<MyDisposable>();  // Returns the same instance as obj
obj2.DoSomething();
container.Dispose();  // Will call the Disposable method of obj
// Now the components need to be added back in   
 container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton);
var obj3 = container.Resolve<MyDisposable>();  // Create a new instance of MyDisposable

К счастью, в моем случае я могу позволить себе просто отбросить все компоненты, и я могу восстановить их довольно легко. Однако это является субоптимальным.

1
ответ дан 3 December 2019 в 07:14
поделиться

Это зависит от образа жизни компонента, который Вы указали, когда Вы добавили его к контейнеру.

Вы использовали бы Выпуск (), Если образ жизни Объединен. Это откладывает компонент в пуле для следующего извлечения (объект не уничтожается, таким образом расположение было бы плохо),

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

Если образ жизни является Потоком, тот же компонент используется для каждого потока, не уничтоженного.

Если образ жизни является Singleton, только один компонент создается и не detroyed.

Скорее всего, Вы используете переходные компоненты? (если Вы обеспокоены избавлением от них своевременно), в этом случае, просто перенесите его с использованием, и Вы установлены (или назовите расположение себя где-нибудь),

using(ISomeService service = container.Resolve<ISomeService>())
{
 // Do stuff here
 // service.Dispose is automatically called 
}

Редактирование - Да, чтобы "обновить" или расположить и воссоздать Ваш одиночный элемент, который Вы должны были бы или уничтожить контейнер или записать пользовательскому жизненному циклу. Выполнение пользовательского жизненного цикла не является на самом деле настолько трудным и сохраняет логику, чтобы сделать так в одном месте.

3
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: