• 如何在Asp.Net Core中注册同一接口的多个实现?


    have services that are derived from the same interface.

    public interface IService { }
    public class ServiceA : IService { }
    public class ServiceB : IService { } 
    public class ServiceC : IService { }
    
    • 1
    • 2
    • 3
    • 4

    Typically, other IoC containers like Unity allow you to register concrete implementations by some Key that distinguishes them.

    In ASP.NET Core, how do I register these services and resolve them at runtime based on some key?

    I don’t see any Add Service methods that take a key or name parameter, which would typically be used to distinguish the concrete implementation.

    public void ConfigureServices(IServiceCollection services)
    {
    // How do I register services of the same interface?
    }

    public MyController:Controller
    {
    public void DoSomething(string key)
    {
    // How do I resolve the service by key?
    }
    }

    Is the Factory pattern the only option here?

    Update1
    I have gone though the article here that shows how to use the factory pattern to get service instances when we have multiple concrete implementations. However, it is still not a complete solution. When I call the _serviceProvider.GetService() method, I cannot inject data into the constructor.

    For example consider this:

    public class ServiceA : IService
    {
         private string _efConnectionString;
         ServiceA(string efconnectionString)
         {
           _efConnecttionString = efConnectionString;
         } 
    }
    
    public class ServiceB : IService
    {    
       private string _mongoConnectionString;
       public ServiceB(string mongoConnectionString)
       {
          _mongoConnectionString = mongoConnectionString;
       }
    }
    
    public class ServiceC : IService
    {    
        private string _someOtherConnectionString
        public ServiceC(string someOtherConnectionString)
        {
          _someOtherConnectionString = someOtherConnectionString;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    How can _serviceProvider.GetService() inject the appropriate connection string? In Unity, or any other IoC library, we can do that at type registration. I can use IOption, however, that will require me to inject all settings. I cannot inject a particular connection string into the service.

    Also note that I am trying to avoid using other containers (including Unity) because then I have to register everything else (e.g., Controllers) with the new container as well.

    Also, using the factory pattern to create service instances is against DIP, as it increases the number of dependencies a client has details here.

    So, I think the default DI in ASP.NET Core is missing two things:

    The ability to register instances using a key
    The ability to inject static data into constructors during registration

  • 相关阅读:
    JSP out.print()和out.write()方法的不同之处
    这几个重要协议,是网络工程师加薪的秘密
    java二手车商城计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    数据结构:链式队列
    TypeScript 基础知识之对象、数组
    [C++] 神奇的 “常量“
    springMVC文件上传和下载(简单案例)
    大一新生HTML期末作业个人介绍博客 使用html+css+javascript+jquery技术制作网页,含有动画,hover效果,含有表格布局
    python列表中str实现大小写转换
    VR航天科普主题公园模拟太空舱体验馆vr航天模拟体验设备
  • 原文地址:https://blog.csdn.net/qq_42980269/article/details/134013566