Ваш лучший ответ - на самом деле использовать контейнер.
То, что вы делаете, говорит: «при создании этого типа используйте этот конкретный экземпляр объекта».Это не использует возможности контейнера для создания экземпляра для вас.Вместо этого вы должны зарегистрировать IService1 и IService2 в контейнере.Затем скажите контейнеру разрешить эти зависимости для вас.
Это выглядит примерно так:
container.RegisterType<IService1, SomeService1>();
container.RegisterType<IService2, SomeService2>();
Что это делает, так это сообщает контейнеру "всякий раз, когда существует зависимость типа IService1, newсоздайте новый объект типа SomeService1 и передайте его так же, как и для IService2.
Итак, вам нужно сообщить контейнеру, что делать с ICustomerService.В большинстве случаев вы должны сделать следующее:
container.RegisterType<ICustomerService, CustomerService>(
// Note, don't need to explicitly say transient, that's the default
new InjectionConstructor(new ResolvedParameter<IService1>(),
new ResolvedParameter<IService2>()));
Это говорит контейнеру: при разрешении ICustomerService создайте новый экземпляр CustomerService, используя конструктор, который принимает IService1 и IService2.Чтобы получить эти параметры, перезвоните в контейнер для разрешения этих типов.
Это немного многословно и часто встречается, поэтому есть несколько ярлыков.Во-первых, вы можете передать объект Type вместо нового ResolvedParameter, например, так:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), typeof (IService2)));
В качестве еще одного сокращения, если CustomerService имеет только один конструктор, или если тот, который вы хотите вызвать, - это тот, который принимаетсамый большой список параметров, вы можете полностью исключить InjectionConstructor, так как это конструктор, который контейнер выберет при отсутствии другой конфигурации.
container.RegisterType<ICustomerService, CustomerService>();
Используемая форма обычно используется, когда вы хотитеконкретное значение, передаваемое параметру конструктора, а не разрешению службы обратно через контейнер.
Чтобы ответить на исходный вопрос - ну, вы не можете сделать именно то, что сказали.Параметру конструктора нужно какое-то значение.Однако вы можете поместить туда все, что захотите, но обычно null работает.
Обратите внимание, что вы также можете смешать две формы.Например, если вы хотите разрешить IService1 и передать значение NULL для параметра IService2, сделайте следующее:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), null));
* EDIT *
На основе приведенного ниже комментария,на самом деле вам нужна еще одна функция - именованные регистрации.
По сути, у вас есть две реализации IService1 и одна из IService2.Итак, что вы можете сделать, это зарегистрировать их обоих, а затем сообщить контейнеру, какой из них использовать.
Прежде всего, чтобы зарегистрировать вторую реализацию, вам нужно дать явное имя:
container.RegisterType<IService1, OtherService1Impl>("other");
Затем вы можете указать контейнеру разрешить IService1, но использовать имя.Это основная причина, по которой существует тип ResolvedParameter.Поскольку вы просто хотите использовать значение по умолчанию для IService2, вы можете использовать typeof () как сокращение.Вам все еще нужно указать оба типа для параметров, но вам не нужно определенное значение.Если это имеет смысл.
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(new ResolvedParameter<IService1>("other"), typeof(IService2));
Это должно делать то, что вам нужно.