2010-03-04 10 views

Respuesta

16

había leído ese artículo pero no lo hizo dame todo lo que necesitaba. AddAllTypesOf registró todos los tipos de hormigón contra IRepositoryInterface pero, en su lugar, requiero que cada tipo concreto se registre contra la interfaz con nombres equivalentes. es decir.

For<IMyRepository>().Use<SqlMyRepository>(); 

También necesito crear algunas instancias con nombre para repositorios de prueba.

For<IMyRepository>().Use<TestMyRepository>().Named("Test"); 

Esto es lo que se me ocurrió que parece funcionar cuando lo necesito.

public class SqlRepositoryConvention : StructureMap.Graph.IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     // only interested in non abstract concrete types that have a matching named interface and start with Sql   
     if (type.IsAbstract || !type.IsClass || type.GetInterface(type.Name.Replace("Sql", "I")) == null) 
      return; 

     // Get interface and register (can use AddType overload method to create named types 
     Type interfaceType = type.GetInterface(type.Name.Replace("Sql","I")); 
     registry.AddType(interfaceType, type); 
    } 
} 

e implementado de la siguiente manera

Scan(cfg => 
      { 
       cfg.TheCallingAssembly(); 
       cfg.Convention<SqlRepositoryConvention>(); 
      }); 
+1

Exactamente lo que necesitaba, gracias –

1

Salida http://codebetter.com/blogs/jeremy.miller/archive/2009/01/20/create-your-own-auto-registration-convention-with-structuremap.aspx

En particular, esta parte

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

       o.TheCallingAssembly(); 
       o.AddAllTypesOf<IController>().NameBy(type => type.Name.Replace("Controller", "")); 

      }); 

     }); 

Así que para usted, creo que algo como esto debería funcionar

 container = new Container(x => 

     { 

      x.Scan(o => 

      { 

       o.TheCallingAssembly(); 
       o.AddAllTypesOf<IRepository>().NameBy(type => type.Name.Replace("I", "Sql")); 

      }); 

     }); 
+0

Gracias, voy a dar que un intento. –

Cuestiones relacionadas