Так как в этом случае целевой тип реализации известен провайдеру.
Затем вы можете получить универсальный тип из запрашиваемого типа и использовать его для создания желаемой реализации.
public class MyRepositoryProvider : IProvider {
private ApplicationDbContext _applicationDbContext;
public MyRepositoryProvider(ApplicationDbContext applicationDbContext) {
_applicationDbContext = applicationDbContext;
}
Type Type => typeof(MyRepository<>);
public object Create(IContext context) {
var genericArguments = context.GenericArguments; //TEntity
var genericType = this.Type.MakeGenericType(genericArguments); //MyRepository<TEntity>
//using reflection to do new MyRepository<TEntity>(_applicationDbContext)
return Activator.CreateInstance(genericType, _applicationDbContext);
}
}
Activator
используется здесь в предположении, что реализация имеет открытый конструктор, как подразумевается кодом в исходном примере. Если не публично, то отражение может быть использовано для нахождения конструкции и ее вызова.
Поставщик зарегистрирован в ядре
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
kernel.Bind(typeof(IMyRepository<>)).ToProvider(typeof(MyRepositoryProvider)).InRequestScope();
, который указывает ядру использовать поставщика при разрешении абстракций.
IMyRepository<MyEntity> repository = kernel.Get<IMyRepository<MyEntity>>();