2017-01-23 3 views
0

Я пытаюсь определить, как я мог бы вводить конкретный экземпляр службы при разрешении типа.Переопределения параметров простого инжектора

Например, с Unity я мог бы сделать что-то вроде:

IFoo fooService = Container.Resolve<IFoo>(); 
fooSerivce.DoBar("someParameter"); 
ParameterOverrides overrides = new ParameterOverrides() 
{ 
    { "fooService", fooService } 
}; 
return Container.Resolve(type, overrides); 

Как бы я сделать это с простым Injector?

+0

Можете ли вы показать конкретный пример того, когда вам это нужно? – Steven

+0

Примером этого может служить [Призматическая библиотека] (https://github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/Prism.Unity.Forms/PrismApplication.cs#L25) –

ответ

1

Простой инжектор не имеет встроенной поддержки для подачи «разрешения» контейнера, потому что эта плохая идея в целом, поскольку основной ее вариант использования заключается в том, чтобы поставлять конструкторы впрыска с данными во время выполнения. Наличие конструкции ваших компонентов приложения зависит от данных времени выполнения - это анти-шаблон, как подробно описано here.

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

Вы должны взглянуть на this частности Q & A. Это говорит о WebFromsMvp, который имеет ту же конструктивную причуду, что и Prism. В вопросе и ответе описывается способ достаточно эффективно обходиться с Simple Injector.

UPDATE

Из примера вы показываете в вашем вопросе, там, кажется, не нуждается в использовании переопределения на всех, так как вы впрыснуть услугу, которая была решена из контейнера. Вместо этого вы можете сделать следующее:

IFoo fooService = Container.GetInstance<IFoo>(); 
fooSerivce.DoBar("someParameter"); 
return Container.GetInstance(type); 

Пока IFoo зарегистрирован в Scoped или Singleton образом жизни, и type принимает в своем конструкторе в IFoo, тот же экземпляр вводил revoled type.

+0

К сожалению, при поддержке в других структурах иногда вы вынуждены идти на компромиссы, включая использование анти-шаблона. Это действительно не помогает ответить на поставленный вопрос. Поскольку я не контролирую создаваемый объект, я не могу просто разрешить тип, а затем установить свойство. Указанный тип необходимо вводить в конструктор во время создания экземпляра. –

+1

Ответ на stackoverflow, о котором я упоминал в этом ответе, показывает, как решить эту проблему. Если это не так, пожалуйста, опишите, почему этот представленный метод не работает. – Steven

+0

Возможно, я просто что-то пропустил, но из ответа на сообщение, на которое вы ссылаетесь, вы регистрируете службу, которая ранее не была зарегистрирована в контейнере. В этом конкретном случае мы разрешаем сервис, который был зарегистрирован в стиле Transient, что-то делает для этого экземпляра, тогда нам нужно ввести этот конкретный экземпляр, если он требуется по типу, который мы хотим разрешить. Я понимаю, что это менее идеальный образец, но это тот, который я должен принять в этом конкретном случае. –

Смежные вопросы