W tym momencie z łatwością wprowadzam elementy do kontrolerów, w niektórych przypadkach budując własną klasę ResolverServices. Życie jest dobre.Wstrzykiwanie zależności z klasami innymi niż klasa kontrolera
Czego nie mogę się dowiedzieć, jak to zrobić, to uzyskać szkielet automatycznie wprowadzany do klas innych niż kontroler. Co robi praca jest posiadanie ramy automatycznie wprowadzić do mojego kontrolera IOptions
, która jest skutecznie konfiguracja dla mojego projektu:
public class MessageCenterController : Controller
{
private readonly MyOptions _options;
public MessageCenterController(IOptions<MyOptions> options)
{
_options = options.Value;
}
}
jestem, że mogę mieć to samo stało dla moich własnych klas Przypuszczam jestem zamknąć kiedy naśladować kontrolera, tak:
public class MyHelper
{
private readonly ProfileOptions _options;
public MyHelper(IOptions<ProfileOptions> options)
{
_options = options.Value;
}
public bool CheckIt()
{
return _options.SomeBoolValue;
}
}
myślę gdzie mam braku kiedy nazywam to tak:
public void DoSomething()
{
var helper = new MyHelper(??????);
if (helper.CheckIt())
{
// Do Something
}
}
proble m Mam śledzenie tego jest praktycznie wszystkim, co mówi o DI mówi o tym na poziomie kontrolera. Próbowałem polować, gdzie to się dzieje w kodzie źródłowym obiektu Controller
, ale robi się tam trochę szaleńczo.
Wiem, że mogę ręcznie utworzyć instancję IOptions i przekazać ją do konstruktora MyHelper
, ale wygląda na to, że powinienem móc uzyskać framework, ponieważ działa on pod Controllers
.
Twoja pomoc jest doceniana.
Podczas korzystania z Dependency Injection nie nazywać 'new'. Nigdy dla obiektów, które powinny zostać rozwiązane. – Tseng
Kiedy próbuję utworzyć instancję MyHelper, nie nazywam nowego? (1) To brzmi zbyt łatwo, (2) Jest to błąd składniowy. :-) –
Tak, to jest cały punkt zastrzyku zależności (szczególnie jeśli używasz inwersji kontrolnych pojemników, które zarządzają i robią to). Aby przesunąć instancję poza twoje usługi/klasy do punktu, w którym kontener ioc robi to wewnętrznie. W przypadkach, w których nie można wstrzyknąć go za pomocą konstruktora, należy utworzyć fabrykę i przekazać interfejs fabryczny do usługi. jego implementacja wykorzystuje kontener do rozwiązania tego problemu, w przypadku ASP.NET Core wstrzykiwania 'IServiceProvider' w twoim zakładzie i wywoływania' IMyHelper helper = services.RequestService() ' –
Tseng