在StructureMap中注册通用接口的泛型实现

时间:2010-02-10 00:13:38

标签: 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();
    }
}

1 个答案:

答案 0 :(得分: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>>();
    }
}