StructureMap, ObjectFactory e l'IContainer
-
22-09-2019 - |
Domanda
sto lavorando con StructureMap per le mie esigenze CIO.
Per rendere le cose piacevolmente verificabili, sto passando casi IContainer
intorno per quanto possibile, di solito come parametri del costruttore. Per comodità, mi piacerebbe essere in grado di ripiegare ad usare ObjectFactory
per un costruttore senza parametri.
Il modo più semplice (ho pensato) per farlo sarebbe quello di ottenere semplicemente il IContainer
le coperture di classe ObjectFactory
e passare che per l'altro costruttore. Purtroppo, non riesco a trovare da nessuna parte l'istanza è pubblicamente esposta.
La domanda è:
C'è un modo per ottenere il IContainer
entro ObjectFactory
in modo da poter gestire nel modo più semplice come istanza fornita dall'utente?
In alternativa, c'è un modo per duplicare la configurazione del ObjectFactory
in una nuova istanza Container
?
Esempio:
Mi piacerebbe essere in grado di effettuare le seguenti operazioni:
public class MyClass
{
public MyClass()
{
Container = ... // The ObjectFactory container instance.
}
public MyClass(IContainer container)
{
Container = container;
}
public IContainer Container { get; private set; }
}
Soluzione
ObjectFactory espone una proprietà contenitore che vi dà l'IContainer che stai cercando.
Ogni volta che avete bisogno di un IContainer (che non dovrebbe essere spesso) si può sempre prendere una dipendenza su di esso nella classe ctor.
public class INeedAContainer
{
private readonly IContainer _container;
public INeedAContainer(IContainer container)
{
_container = container;
}
// do stuff
}
Non credo che ci sia un modo per clonare un IContainer. C'è un metodo container.GetNestedContainer (), che consente di mantenere i transienti lo stesso per tutta la durata del contenitore nidificato. contenitori nidificati sono spesso utilizzati all'interno di un'istruzione "usando" e sono molto utili per controllare lo stato di cose come i limiti delle transazioni del database.