Wie Dependency Injection Container verwenden, wenn ich einen variablen nicht statischen Parameter habe, den ich liefern muss? dieseWie platziert man eine Klasse, die einen Variablenparameter benötigt, in den Dependency-Injection-Container?
Was ich in meinem Code möchte, ist:
$staff = $container->get(Staff::class);
Was ich jetzt habe, ist dies:
$staff = new Staff("my_great_username");
Beachten Sie, dass Benutzernamen ändern kann und wird zur Laufzeit geliefert .
Ich kann nicht scheinen Staff
in meinem DI-Container zu setzen, weil es dort keine Möglichkeit gibt, einen Variablenparameter anzugeben.
Mein Problem ist ...
Ich bin mit Fabrik-basierten Container, nämlich Zend\ServiceManager\ServiceManager
.Dies ist eine Fabrik, die ich Details zu verstecken Instanziierung verwenden:
class StaffFactory
{
function __invoke(ContainerInterface $container): Staff
{
/*
* I do not seem to know how to get my username here
* nor if it is the place to do so here
*/
$staff = new Staff(????????);
return $staff;
}
}
So wie ich gesetzt bis den Behälter in meiner Config ist dies:
'factories' => [
Staff::class => StaffFactory::class
]
Hinweis: auch wenn der Parameter eine "Variable" ist, ich will Staff
unveränderlich sein. Sobald es einmal erstellt ist, bleibt es so. Daher möchte ich nicht speziell eine setter
Methode für den Benutzernamen machen, da dies bedeutet, dass die Klasse veränderbar ist, wenn dies nicht der Fall ist.
Was schlagen Sie vor?
Wenn Sie das auch stümpfen, upvote diese Frage xD – Dennis
Ich bin verwirrt - warum verwenden Sie den IOC-Container als Service-Locator und insbesondere mit konkreten Klassen - so scheint es keinen Vorteil gegenüber 'neu zu haben ' – Steve
Wo sehen Sie die Verwendung von IoC als Service-Locator? Wie ich es verstehe, wird es nur zu einem Service-Locator, wenn ich '$ container' in meine eigenen Klassen injiziere, wo ich dann ziehen kann, was immer ich will.Da 'ServiceManager' ein werkbasierter IoC ist, solange ich' $ container' als Teil des Boot-Strap benutze, bleibt es ein IoC. aka, "$ container" in Factory zu injizieren, ist ein akzeptierter Anwendungsfall für IoC, und diese Injektion bleibt in dieser Factory lokalisiert und fließt nicht in meine eigenen Klassen ein, wodurch Service-Locator-Muster vermieden werden. – Dennis