2009-03-27 5 views
5

J'ai IRepository < T>, et l'implémentation SqlRepository < T>. SqlRepository possède un paramètre DataContext dans le constructeur.Injecter un objet différent au constructeur avec StructureMap pour certain cas

configuration SM ressemble à ceci:

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; 
        }); 

Mais pour la construction de IRepository < SpecificObject> Je veux injecter différents DataContext. Comment puis-je dire SM que quand je demande IReposiotry < SpecificObject> Je veux différent DataContext, pas FirstDataContext mais SecondDataContext (que DC va à la base de données différente). Par exemple, quand je demande IRepository < T> Je veux que FirstDataContext soit injecté, mais quand je demande explicitement pour IRepository < Product> Je veux que SecondDataContext soit injecté.

En outre, que SecondDC devrait être mis en cache hybride par SM!

Répondre

4

Quelque chose comme ...

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

cela a fonctionné! Super, merci beaucoup! –

1

Cela m'a vraiment aidé aussi. Avoir une classe concrète utilisée dans un constructeur qui à son tour obtient une chaîne de connexion différente dans son constructeur en fonction de la classe "parent" qui l'utilise. Merci.

  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>(); 
            }); 
Questions connexes