Resolving Generic Interface with Autofac

autofac, c#

Solution

Autofac supports open generics. You can use the following code if generics type is known at compile time:

var builder = new ContainerBuilder();

builder.RegisterGeneric(typeof(SomeInstance1<>))
  .As(typeof(IGenericInterface<>));              

var container = builder.Build();

var instance1 = container.Resolve<IGenericInterface<SubClass1>>();

Assert.IsInstanceOfType(typeof(SomeInstance1<SubClass1>), instance1);

If type parameter is not known until runtime (which is likely your case if you want to iterate through collection of types) then you can build your type using MakeGenericType:

        var typeInRuntime = typeof (SubClass1);
        var instance1 = container.Resolve(typeof(IGenericInterface<>).MakeGenericType(typeInRuntime));

Problem

Given the following code, how do I resolve the right SomeInstance in autofac? ``` public class BaseClass {} public class SubClass1 : BaseClass {} public class SubClass2 : BaseClass {} public interface IGenericInterface<T> where T : BaseClass {} public class SomeInstance1<T> : IGenericInterface<T> where T : SubClass1 public class SomeInstance2<T> : IGenericInterface<T> where T : SubClass2 ``` I want to choose SomeInstance1 or 2 based on the type of of the generic on the sub classes. So for example I have a collection of sub classes (SubClass1, 2....) and while iterating over them I want to choose the right SomeInstance class.

Original source