Как передать аргументы конструктору в платформе IOC

Вы можете использовать Array.reduce и Object.values для получения желаемого результата:

const matrixArray = [
  {Responded: 1, RowName: 'row1', ColName: 'col1'},
  {Responded: 2, RowName: 'row1', ColName: 'col2'},
  {Responded: 0, RowName: 'row1', ColName: 'col3'},
  {Responded: 0, RowName: 'row2', ColName: 'col1'},
  {Responded: 0, RowName: 'row2', ColName: 'col2'},
  {Responded: 1, RowName: 'row2', ColName: 'col3'},
  {Responded: 1, RowName: 'row3', ColName: 'col1'},
  {Responded: 0, RowName: 'row3', ColName: 'col2'},
  {Responded: 1, RowName: 'row3', ColName: 'col3'}
];

const result = Object.values(matrixArray.reduce((result, entry) => {
  if (!(entry.RowName in result)) {
    result[entry.RowName] = {RowName: entry.RowName};
  }
  if (!(entry.ColName in result[entry.RowName])) {
    result[entry.RowName][entry.ColName] = 0;
  }
  result[entry.RowName][entry.ColName] += entry.Responded;
  return result;
}, {}));

console.log(result);
[1118 ]

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

Объяснение:

  • Array.reduce зацикливается на массиве и создает карту RowName => {RowName, col1, col2, col3} (объект), увеличивая на соответствующую величину Responded на каждой итерации),
  • [1112 ] Object.values затем преобразует это обратно в массив.

12
задан Edward Wilde 21 February 2009 в 17:37
поделиться

7 ответов

В карте структуры Вы могли достигнуть этого использования С методом:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

См.: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

9
ответ дан 2 December 2019 в 07:23
поделиться

Для замка Windsor:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

отметьте использование анонимного объекта для определения аргументов конструктора.

использование StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
5
ответ дан 2 December 2019 в 07:23
поделиться

Как это может быть агностиком языка? Это - деталь реализации рассматриваемой платформы.

Spring позволяет Вам указывать c'tor args как список значений/ссылок, если это - Ваша вещь. Это не очень читаемо, тем не менее, по сравнению с инжекцией свойства.

Некоторые люди становятся горячими под кольцом об этом и настаивают, что c'tor инжекция является единственным ориентированным на многопотоковое исполнение подходом в Java. Технически они корректны, но на практике это имеет тенденцию не иметь значение.

4
ответ дан 2 December 2019 в 07:23
поделиться

Да, другие платформы более многофункциональны - необходимо использовать платформу МОК, которая допускает инжекцию конструктора. Spring является примером многоязычного контейнера МОК, который позволяет внедрение зависимости конструктора.

0
ответ дан 2 December 2019 в 07:23
поделиться

Это не должна быть очень общая потребность, но иногда это - допустимое. Ninject, который легче, чем StructureMap, позволяет Вам передавать параметры при получении временных объектов от контекста. Spring.NET также.

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

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

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

Можно также сделать это с Виндзором легко

0
ответ дан 2 December 2019 в 07:23
поделиться

Другие платформы МОК более многофункциональны.

Т.е. проверьте ParameterResolution с Autofac

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

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