2010-02-10 8 views
2

j'ai une interface génériqueEnregistrement d'une mise en œuvre Generics d'une interface générique dans StructureMap

public interface IDomainDataRepository<T> 
{ 
    T[] GetAll(); 
} 

avec une implémentation générique

public class DomainDataRepository<T> : IDomainDataRepository<T> 
{ 
    public virtual T[] GetAll() 
    { 
     return GetSession().Linq<T>().ToArray(); 
    } 
} 

comment dois-je inscrire dans StructureMap de sorte que si je demande IDomainDataRepository<State> alors il sera nouveau DomainDataRepository<State>. En outre, si je décide d'implémenter un CountryDomainDataRepository et que je demande un IDomainDataRepository<Country>, je veux obtenir l'implémentation spécifique.

public class CountryDomainDataRepository : IDomainDataRepository<State> 
{ 
    public virtual Country[] GetAll() 
    { 
     return GetSession().Linq<Country>().ToArray(); 
    } 
} 

Répondre

4

Vous pouvez accomplir cela en configurant le type ouvert générique d'utiliser un type ouvert en béton:

[TestFixture] 
public class open_generic_registration 
{ 
    [Test] 
    public void should_resolve_to_the_configured_concrete_instance_of_T() 
    { 
     var container = new Container(cfg => 
     { 
      cfg.For(typeof (IDomainDataRepository<>)).Use(typeof (DomainDataRepository<>)); 
     }); 

     container.GetInstance<IDomainDataRepository<string>>().ShouldBeOfType<DomainDataRepository<string>>(); 
     container.GetInstance<IDomainDataRepository<int>>().ShouldBeOfType<DomainDataRepository<int>>(); 
     container.GetInstance<IDomainDataRepository<DateTime>>().ShouldBeOfType<DomainDataRepository<DateTime>>(); 
    } 
}