Как я могу передать значение конструкторам коллекции экземпляров во время выполнения с помощью простого инжектора?

Я знаю, что могу передать значение одному экземпляру:

container.Register(() => new Service(value));

Но я хочу зарегистрировать коллекцию экземпляров, используя коллекцию сборок, например:

container.RegisterCollection<IService>(assemblies);

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

Обновить

Из-за комментария Стивена я должен уточнить, что значение, которое я хочу передать, равно CancellationToken.


person shda    schedule 06.11.2015    source источник
comment
В вопросе отсутствует некоторая важная информация (это было указано в комментарии к одному из ответов), и что данные, которые необходимо ввести, являются токеном отмены. Такой токен отмены является данными runtimer, а данные времени выполнения не следует вводить в конструкторы компонентов.   -  person Steven    schedule 09.11.2015


Ответы (2)


Не рекомендуется полагаться на примитивные значения. Сервис должен зависеть от абстракций. Создайте новый интерфейс, описывающий службу, которая предоставляет необходимое значение, и заставьте экземпляры зависеть от этого. Если разным экземплярам требуются разные значения, они должны зависеть от отдельных интерфейсов для предоставления значений. Этот ответ содержит более подробную информацию и пример того, как добиться того, что вы пытаетесь сделать.

person prprcupofcoffee    schedule 06.11.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person djv; 06.11.2015
comment
@Verdolino - согласился и отредактировал соответственно. Спасибо, что указали на это. - person prprcupofcoffee; 06.11.2015
comment
Я прочитал этот ответ. Но у меня нет дублированного кода и нечего выделять для разделения интерфейса и конкретного типа. Мне просто нужно передать CancellationToken экземплярам службы, чтобы остановить все потоки и потоки данных, когда это необходимо. Токен должен быть одинаковым для всех экземпляров. Как мне создать описывающий интерфейс, предоставляющий токен? Источник токена должен быть доступен в корне композиции. - person shda; 07.11.2015
comment
Исходный код выглядит так, как будто вы передаете значение конструктору. Вы пытаетесь передать CancellationToken конструктору всех ваших экземпляров службы? - person prprcupofcoffee; 07.11.2015
comment
Да, это именно то, что я пытаюсь сделать - person shda; 07.11.2015
comment
Создайте ICancellationTokenProvider и пусть ваш сервис зависит от этого. Реализация этого интерфейса теперь дает вам возможность позже выбирать, как возвращать токен, даже если сейчас ему не нужен такой уровень логики. - person prprcupofcoffee; 07.11.2015
comment
Или передайте токен отмены через общедоступный API ваших сервисов. Этот токен кажется мне данными времени выполнения. - person Steven; 07.11.2015

Можете ли вы использовать простой цикл foreach для достижения этой цели? Этот код не проверен...

Collection<IService> myServices = new Collection<IService>();
myServices.Add(service1);
myServices.Add(service2);

foreach (IService svc in myServices) 
{
     container.Register(svc);
}
person Dave Smash    schedule 06.11.2015