Как pNet Core 3.1 | DependencyInjection с запасным разрешением - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы знать, есть ли способ настроить разрешение зависимостей, чтобы разрешить резервные (более общие 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));
        }
    }

Но мне не нравится это из-за использования шаблона локатора службы.

У кого-нибудь есть идея решить эту проблему без расположения службы?

...