tags:

views:

56

answers:

1

i have a generic interface

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

with a generic implementation

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

how do I register it in StructureMap so that if I request IDomainDataRepository<State> then it will new up a DomainDataRepository<State>. Furthermore if I decide to implement a CountryDomainDataRepository and I request a IDomainDataRepository<Country> I want to get the specific implementation.

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

You can accomplish this by configuring the generic open type to use a concrete open type:

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