2009-03-27 7 views
5

Tengo IRepository < T>, e implementación SqlRepository < T>. SqlRepository tiene el parámetro DataContext en constructor.Inyectar un objeto diferente al constructor con StructureMap para ciertos casos

configuración SM se ve así:

x.ForRequestedType(typeof(IRepository<>)) 
.TheDefaultIsConcreteType(typeof(SqlRepository<>)); 

x.ForRequestedType<DataContext>().CacheBy(InstanceScope.Hybrid) 
.TheDefault.Is.ConstructedBy(()=>{ 
         var dc = new FirstDataContext(); 
         dc.Log = new DebuggerWriter(); 
         return dc; 
        }); 

Pero para la construcción de IRepository < SpecificObject> Quiero inyectar diferentes DataContext. ¿Cómo digo SM que cuando solicito IReposiotry < SpecificObject> Quiero diferente DataContext, no FirstDataContext sino SecondDataContext (ese DC va a diferentes bases de datos).

Por ejemplo, cuando pido IRepository < T> Quiero FirstDataContext a inyectar, pero cuando pido explícitamente para IRepository < producto> Quiero SecondDataContext a inyectar.

¡Además, ese SecondDC debe ser Hybrid cache by SM!

Respuesta

4

Algo así como ...

ForRequestedType<DataContext>() 
    .CacheBy(InstanceScope.Hybrid) 
    .AddInstances(inst => inst.ConstructedBy(() => 
     new SecondDataContext { Log = new DebuggerWriter() }) 
     .WithName("secondDataContext")) 
    .TheDefault.Is 
    .ConstructedBy(() => new FirstDataContext {Log = new DebuggerWriter()}); 

ForRequestedType<IRepository<SpecificObject>>() 
    .TheDefault.Is 
    .OfConcreteType<SqlRepository<SpecificObject>>() 
    .CtorDependency<DataContext>() 
    .Is(inst => inst.TheInstanceNamed("secondDataContext")); 
+0

funcionó! Genial, muchas gracias! –

1

Eso realmente me ayudó también. Haga que se use una clase concreta en un constructor que a su vez obtenga una cadena de conexión diferente en su constructor, dependiendo de qué clase "padre" lo esté usando. Gracias.

  ObjectFactory.Initialize(x=> 
            { 
             // Different connection string for each usage 
             // of the RelationalGateway class 
             x.ForRequestedType<RelationalGateway>() 
              .AddInstances(r => 
               r.ConstructedBy(() => 
                new RelationalGateway(ConfigRepository.DataSourceName)) 
              .WithName("config")) 
              .TheDefault.Is.ConstructedBy(
              () => new RelationalGateway(OracleSpatialRepository.DataSourceName)); 

             // Inject the right RelationalGateway 
             x.ForRequestedType<IConfigRepository>() 
              .TheDefault.Is.OfConcreteType<ConfigRepository>() 
              .CtorDependency<RelationalGateway>().Is(inst => 
               inst.TheInstanceNamed("config")); 

             x.ForRequestedType<ISpatialRepository>() 
              .TheDefault.Is.OfConcreteType<OracleSpatialRepository>() 
              .CtorDependency<RelationalGateway>().IsTheDefault(); 

             // Other simple types 
             x.ForRequestedType<IIdGenerator>().TheDefaultIsConcreteType<IdGenerator>(); 
            }); 
Cuestiones relacionadas