StructureMap: blues del costruttore predefinito
-
21-12-2019 - |
Domanda
Sto impazzendo, quindi ho preso questo
public class FrameworkDbTestBase : IDisposable
{
protected readonly FrameworkDb Db;
public FrameworkDbTestBase()
{
var connection = Effort.DbConnectionFactory.CreateTransient();
Db = new FrameworkDb(connection);
}
public void Dispose()
{
Db.Dispose();
}
}
Questo sta prendendo in giro l'ef6 con sforzo..lo adoro, così posso eseguire continuamente test in background mentre tutte le modifiche vengono apportate alla mia base di codice...è fantastico ma sfortunatamente ne ho bisogno
public partial class FrameworkDb : DbContext
{
public FrameworkDb() : base("DefaultConnection"){}
public FrameworkDb(DbConnection connection): base(connection, true)
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Site> Sites { get; set; }
...
per ottenere la derisione di ef6 con impegno, tuttavia Structuremap insiste nel crearmi un'istanza FrameworkDb con il costruttore lungo quello con il parametro di iniezione DbConnection, quindi ottengo questo:
StructureMap.StructureMapException was unhandled by user code
HResult=-2146232832
Message=StructureMap Exception Code: 202
No Default Instance defined for PluginFamily System.Data.Common.DbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Source=StructureMap
ErrorCode=202
Sospiro!Alzo gli occhi al cielo...Voglio che StructureMap mi usi l'altro costruttore più breve, quindi dopo aver scavato un po' secondo questo post: Mappa della struttura: non voglio usare il costruttore più avido! Dovrei cambiare questo:
For<FrameworkDb>().Use <FrameworkDb>();
a questa
For<FrameworkDb>().Use(() => new FrameworkDb());
Nessuna fortuna, sempre lo stesso errore...e non voglio rimuovere il costruttore della connessione altrimenti il mio test di integrazione non funzionerà più...Quindi forse usa la connessione solo per costruire la mappatura e non usarla effettivamente nell'iniezione stessa ...non molta fortuna ...aggiungendo questo:
For<DbConnection>().Use(() => new EntityConnection("DefaultConnection"));
mi dà questo:
StructureMap.StructureMapException was unhandled by user code
HResult=-2146232832
Message=StructureMap Exception Code: 207
Internal exception while creating Instance '00fbcc4f-c5f0-4eb3-b814-9d0ba1bb8e19' of PluginType System.Data.Common.DbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. Check the inner exception for more details.
Source=StructureMap
ErrorCode=207
Beh, questo per quanto riguarda quella teoria...ehm...soluzione qualcuno?Ciaooo qualcuno?Sospiro...
Soluzione
Andiamo gente, nessuno?La risposta è così semplice...BENE
var framework = new Framework();
For<FrameworkDb>().Use(() => framework);
Così semplice eppure così elegante e qualcosa che devi solo sapere!