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>();
});
Exactamente lo que necesitaba, gracias –