Я хотел бы знать, есть ли способ настроить разрешение зависимостей, чтобы разрешить резервные (более общие c) службы, если более конкретная c не найдена. Позвольте мне объяснить на примере:
public interface IService<T> : IService {
}
public interface IService {
void DoSomething();
}
public class A {
private readonly IService _service;
public A(IService service) { _service = service ;}
}
public class B {
private readonly IService _service;
public B(IService service) { _service = service ;}
}
public class C {
private readonly IService _service;
public C(IService service) { _service = service ;}
}
public class DefaultService : IService { ... }
public class ServiceForTypeC : IService<C> { ... }
public class Startup {
....
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton<IService, DefaultService>()
.AddSingleton<IService<C>, ServiceForTypeC>();
}
}
я хочу, чтобы A и B вводились с помощью DefaultService, а C вводились с помощью ServiceForType C.
Я думал, что решение было бы следующее:
public interface IService<T> : IService {
}
public interface IService {
void DoSomething();
}
public class ServiceResolver {
private IServiceProvider _provider;
public ServiceResolver(IServiceProvider provider) { _provider = provider; }
public T ResolveWithFallback<T, T2>() where T2 : T {
return _provider.GetService<T2>() ?? _provider.GetService<T>():
}
}
public class A {
private readonly IService _service;
public A(ServiceResolver resolver) {
_service = resolver.ResolveWithFallback<IService, IService<A>>() ;}
}
public class B {
private readonly IService _service;
public B(ServiceResolver resolver) {
_service = resolver.ResolveWithFallback<IService, IService<B>>() ;}
}
}
public class C {
private readonly IService _service;
public C(ServiceResolver resolver) {
_service = resolver.ResolveWithFallback<IService, IService<C>>() ;}
}
}
public class DefaultService : IService { ... }
public class ServiceForTypeC : IService<C> { ... }
public class Startup {
....
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton<IService, DefaultService>()
.AddSingleton<IService<C>, ServiceForTypeC>()
.AddSingleton(provider => new ServiceResolver(provider));
}
}
Но мне не нравится это из-за использования шаблона локатора службы.
У кого-нибудь есть идея решить эту проблему без расположения службы?