2009-07-02 11 views
7

Estoy intentando configurar el NCommon NHRepository en mi proyecto con Structure Map. ¿Cómo evito que elija el constructor más codicioso?Mapa de estructura - ¡No quiero usar el constructor más codicioso!

public class NHRepository<TEntity> : RepositoryBase<TEntity> 
{ 

    public NHRepository() {} 


    public NHRepository(ISession session) 
    { 
     _privateSession = session; 
    } 

    ... 
} 

Mi configuración de mapa de estructura

ForRequestedType(typeof (IRepository<>)) 
       .TheDefaultIsConcreteType(typeof(NHRepository<>)) 

Saludos Jake

Respuesta

8

Puede establecer el atributo [DefaultConstructor] para el constructor que desea como valor predeterminado. En su caso, establecerlo en el constructor NHRepository() lo convertiría en el constitutivo predeterminado para que StructureMap se inicialice.

Actualización: así, en la última versión de StructureMap, utilizando .NET 3.5 también se puede especificar usando el método SelectConstructor:

var container = new Container(x => 
{ 
    x.SelectConstructor<NHRepository>(()=>new NHRepository()); 
}); 

Por último, estoy seguro de que sería capaz de definirlo en la configuración XML de StructureMap, pero no la he usado. Podrías hacer una pequeña búsqueda en él. Para obtener más información sobre el método anterior, véase: http://structuremap.sourceforge.net/ConstructorAndSetterInjection.htm#section3

+0

Hola Razzie, aplaude por la respuesta, sin embargo, el NHRepository está en el NCommon.NHibernate.dll que no puedo cambiar. Entonces, ¿debería heredar del NHRepository en mi proyecto y poner el atributo en su constructor? – superlogical

+0

No había pensado sobre eso. Vea mi respuesta actualizada para usar el método SelectConstructor, pero eso solo es posible en .NET 3.5 – Razzie

+0

¡Malvado muchas gracias por esto! Stackoverflow es increíble! También – superlogical

1

Así 1 para Razzie porque esto funciona si el NHRepository estaba en mi propia asamblea, en lugar elijo para envolver el NHRepository con mi propio repositorio, como a continuación ..

public class Repository<T> : NHRepository<T> 
{ 
    [DefaultConstructor] 
    public Repository() 
    { 

    } 

    public Repository(ISession session) 
    { 

    } 
} 

ForRequestedType(typeof (IRepository<>)) 
       .TheDefaultIsConcreteType(typeof (Repository<>)); 
Cuestiones relacionadas