代码之家  ›  专栏  ›  技术社区  ›  Jon Erickson

在结构映射中注册泛型接口的实现

  •  2
  • Jon Erickson  · 技术社区  · 16 年前

    我有一个通用接口

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

    使用通用实现

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

    如何在结构映射中注册它,以便在我请求时 IDomainDataRepository<State> 然后它会更新一个 DomainDataRepository<State> . 此外,如果我决定执行 CountryDomainDataRepository 我请求一个 IDomainDataRepository<Country> 我想得到具体的实现。

    public class CountryDomainDataRepository : IDomainDataRepository<State>
    {
        public virtual Country[] GetAll()
        {
            return GetSession().Linq<Country>().ToArray();
        }
    }
    
    1 回复  |  直到 16 年前
        1
  •  4
  •   KevM    16 年前

    您可以通过将通用打开类型配置为使用具体的打开类型来完成此操作:

        [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>>();
        }
    }