Регистрация универсальной реализации универсального интерфейса в StructureMap - PullRequest
2 голосов
/ 10 февраля 2010

у меня есть универсальный интерфейс

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 Ответ

4 голосов
/ 10 февраля 2010

Вы можете сделать это, настроив общий открытый тип для использования конкретного открытого типа:

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