Sto usando Prism, che è anche il bel contenitore Unity IoC. Sono nuovo del concetto, quindi non mi sono ancora messo le mani intorno. Quello che voglio fare ora è creare un oggetto usando il contenitore IoC, ma passando anche un parametro extra. Mi permetta di spiegare con un esempio ..:Creazione di oggetti usando Unity Resolve con parametri aggiuntivi
Ho una classe che accetta un oggetto comandi. Questo è registrato nel contenitore CIO, ti gestirlo bene:
public class Person
{
public Person(IApplicationCommands commands) { .. }
..
}
Person person = _container.Resolve<Person>();
ora - voglio passare a un altro argomento - per esempio il nome della persona. Tuttavia, voglio ancora utilizzare il contenitore IoC per gestire la risoluzione e quindi ottenere gli altri paramenter dal contenitore IoC. Ma inserisci il nome come parametro "personalizzato". Può essere fatto?
public class Person
{
public Person(IApplicationCommands commands, string name) { .. }
..
}
string name = "John";
Person person = _container.Resolve<Person>(name); // ....??
Questo esempio non sembra funzionare, ma esiste un modo per farlo funzionare? Oppure il contenitore Unity IoC richiede che tutti i parametri siano registrati nel contenitore prima di chiamare Resolve?
io non lo consiglio uno di questi approcci. Anche se l'utilizzo di contenitori con ambito o la registrazione di istanze con nome logico sono tecniche valide per alcuni scenari, non sono appropriati dato il presunto contesto di creazione di nuove entità DDD. Certamente non è possibile prevedere quali nuovi oggetti Person potrebbero aver bisogno di essere creati se questo è legato alla registrazione di nuovi clienti, e anche se tu potessi ... beh, penso che tu capisca il problema che si presenterebbe. La seconda opzione è sicuramente più valida, ma è meglio esprimere le dipendenze richieste tramite i parametri del costruttore ... –
Anche questo non affronta quello che vedo essere un difetto nella modellazione di Persona per iniziare e l'uso diretto del contenitore come localizzatore di servizi per la creazione di un tipo di questo tipo. –
Certamente l'opzione del contenitore con scope è il più sciocco delle due opzioni, ma funziona. Ho anche dato per scontato che l'OP abbia minimizzato la sua domanda e non stia cercando di fare qualcosa di simile su una semplice Entità, ma su un oggetto di servizio più complesso. Ho sempre questo problema con questi oggetti dove l'oggetto ha alcune dipendenze, ma ha anche bisogno di dati di istanza passati ad esso che devo intervenire quando viene passato. Questo è il motivo per cui altri contenitori IoC, come Ninject, supportano esattamente ciò che l'OP vuole. L'unità non lo è ancora. –