2010-02-10 60 views
2

我有一個通用的接口註冊一個通用接口的泛型實施StructureMap

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

與通用實現

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

我怎麼在StructureMap進行註冊,這樣,如果我要求IDomainDataRepository<State>然後它將新增一個DomainDataRepository<State>。此外,如果我決定實施CountryDomainDataRepository,並且我要求IDomainDataRepository<Country>我想要具體實施。

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

回答

4

可以通過配置通用的開放式用一個具體的開放式做到這一點:

[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>>(); 
    } 
} 
相關問題