Есть ли в среде внедрения зависимостей Unity эквивалент запуска BuildUp с InjectionConstructors?

Одна вещь, которую я всегда хотел иметь в инфраструктуре 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 выполняла сопоставление зарегистрированных сервисов для меня, и, если возможно, я хотел бы, чтобы мои потребители не попадали в контейнер. Есть ли способ сделать это, что я пропустил?


person bwerks    schedule 17.07.2014    source источник


Ответы (1)


Как вы обнаружили, метод .BuildUp работает только с существующими экземплярами, для создания новых экземпляров с помощью Unity вы хотите использовать методы .Resolve, они создадут экземпляр, внедряющий любые зависимости по мере необходимости.

В вашем примере используйте var consumer = container.Resolve<ConsumerClass>(), и все зависимости будут внедрены. Вам не требуется никакой регистрации для ConsumerClass, потому что это конкретный тип, который Unity может обрабатывать неявно.

person Lukazoid    schedule 27.07.2014