В ASP.NET Core одна из вещей, которые вы можете сделать с помощью инфраструктуры внедрения зависимостей Microsoft , - это связать "открытые универсальные типы" (универсальные типы, не привязанные к конкретному типу), например так:
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(typeof(IRepository<>), typeof(Repository<>))
}
Вы также можете использовать фабричный шаблон для увлажнения зависимостей. Вот надуманный пример:
public interface IFactory<out T> {
T Provide();
}
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<Foo>),
p => p.GetRequiredService<IFactory<IRepository<Foo>>().Provide()
);
}
Тем не менее, я не смог понять, как объединить две концепции вместе. Кажется, что это началось бы с чего-то вроде этого, но мне нужен конкретный тип, который используется для гидратации экземпляра IRepository<>
.
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<>),
provider => {
// Say the IServiceProvider is trying to hydrate
// IRepository<Foo> when this lambda is invoked.
// In that case, I need access to a System.Type
// object which is IRepository<Foo>.
// i.e.: repositoryType = typeof(IRepository<Foo>);
// If I had that, I could snag the generic argument
// from IRepository<Foo> and hydrate the factory, like so:
var modelType = repositoryType.GetGenericArguments()[0];
var factoryType = typeof(IFactory<IRepository<>>).MakeGenericType(modelType);
var factory = (IFactory<object>)p.GetRequiredService(factoryType);
return factory.Provide();
}
);
}
Если я пытаюсь использовать функтор Func<IServiceProvider, object>
с открытым универсальным модулем, я получаю этот ArgumentException
с сообщением Open generic service type 'IRepository<T>' requires registering an open generic implementation type.
от CLI dotnet. Он даже не доходит до лямбды.
Возможен ли этот тип привязки в среде внедрения зависимостей Microsoft?