2009-02-05 21 views
9

tengo una interfaz:registro StructureMap Auto de tipos genéricos utilizando Scan

IRepository<T> where T : IEntity 

mientras estoy golpeando mi UI im usando algunas implementaciones del repositorio falsos que sólo devuelve los datos antiguos.

se ven así:

public class FakeClientRepository : IRepository<Client> 

Por el momento estoy haciendo esto:

ForRequestedType<IRepository<Client>>() 
    .TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>(); 

pero un montón de veces para todos mis IEntities. ¿Es posible usar Scan para auto registrar todos mis repositorios falsos para su respectivo IRepository?

Editar: esto es por lo que yo tengo, pero me da errores diciendo el tipo isnt solicitado registrado :(

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.AddAllTypesOf(typeof(IRepository<>)); 
    x.WithDefaultConventions(); 
}); 

Gracias

Andrew

Respuesta

13

Hay una manera más fácil de hacer esto. Por favor, vea esta entrada de blog para más detalles: Advanced StructureMap: connecting implementations to open generic types

public class HandlerRegistry : Registry 
{ 
    public HandlerRegistry() 
    { 
     Scan(cfg => 
     { 
      cfg.TheCallingAssembly(); 
      cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
      cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
     }); 
    } 
} 

Hacerlo de esta manera se evita tener que crear sus propios ITypeScanner o convenciones.

6

Gracias Chris, eso es exactamente lo que necesitaba. Para mayor claridad, aquí lo que yo d Identificación de su enlace:

Scan(x => 
{ 
    x.TheCallingAssembly(); 
     x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>(); 
    x.With<FakeRepositoryScanner>(); 
}); 


private class FakeRepositoryScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>)); 
     if (interfaceType != null) 
     { 
      graph.AddType(interfaceType, type); 
     } 
    } 
}