Одна вещь, которую я всегда хотел иметь в инфраструктуре DI, — это возможность использовать конструкторы внедрения с объектами, которые взаимодействуют с инфраструктурой только для использования служб. Например:
public class ServiceClass : IServiceInterface
{
public string Name { get; set; }
}
public class ConsumerClass // explicitly implements no interfaces
{
private readonly IServiceInterface service;
public IServiceInterface Service { get { return service; } }
[InjectionConstructor]
public ConsumerClass(IServiceInterface service)
{
this.service = service;
}
}
static void Main()
{
IUnityContainer container;
// blah blah DI setup stuff
container.RegisterType<IServiceInterface, ServiceClass>();
// Key point here!
container.Instantiate<ConsumerClass>();
// Alternatively:
container.Instantiate(typeof(ConsumerClass));
}
Метод BuildUp() в IUnityContainer как бы делает это, но для этого требуется, чтобы у вас был экземпляр для передачи, и я не могу этого сделать, если хочу использовать конструкторы внедрения.
Кроме того, я мог бы использовать:
container.RegisterType(typeof(ConsumerClass),
new InjectionConstructor(container.Resolve<IServiceClass>()));
Тем не менее, это требует написания большого количества кода, особенно для классов, которые могут иметь несколько параметров в конструкторе, и, похоже, в первую очередь устраняет полезность контейнера.
Есть также:
container.RegisterType<ConsumerClass, ConsumerClass>();
Однако с этим я на самом деле не хочу регистрировать тип - я просто хочу, чтобы он был создан с его зависимостями, заполненными через InjectionConstructor.
Итак, вкратце: я хочу использовать конструкторы инъекций, и я хочу, чтобы Unity выполняла сопоставление зарегистрированных сервисов для меня, и, если возможно, я хотел бы, чтобы мои потребители не попадали в контейнер. Есть ли способ сделать это, что я пропустил?