c# structure map
StructureMap Registro automático para tipos genéricos usando Scan (3)
Eche un vistazo a esta discusión del grupo de usuarios de StructureMap: http://groups.google.com/group/structuremap-users/browse_thread/thread/649f5324c570347d
Tengo una interfaz:
IRepository<T> where T : IEntity
mientras estoy destruyendo mi interfaz de usuario usando algunas implementaciones de repositorio falsas que simplemente devuelven cualquier dato anterior.
Se ven así:
public class FakeClientRepository : IRepository<Client>
En este 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 lo más lejos que tengo, pero recibo errores que dicen que el tipo solicitado no está registrado :(
Scan(x =>
{
x.TheCallingAssembly();
x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
x.AddAllTypesOf(typeof(IRepository<>));
x.WithDefaultConventions();
});
Gracias
Andrés
Hay una manera más fácil de hacer esto. Consulte la publicación de este blog para obtener más detalles: Advanced StructureMap: conectar implementaciones para abrir tipos genéricos
public class HandlerRegistry : Registry
{
public HandlerRegistry()
{
Scan(cfg =>
{
cfg.TheCallingAssembly();
cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
}
}
Hacerlo de esta manera evita tener que crear su propio ITypeScanner
o convenciones.
Gracias Chris , eso es exactamente lo que necesitaba. Para mayor claridad, aquí está lo que hice 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);
}
}
}