首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在构造函数中注入IEnumerable<ICustomRepository>,这样我就可以决定在基类中使用哪一个?

在构造函数中注入IEnumerable<ICustomRepository>是通过依赖注入(Dependency Injection)的方式来实现的。依赖注入是一种设计模式,可以帮助解耦和管理各个组件之间的依赖关系。

依赖注入的主要目的是通过将依赖对象的创建和管理交给外部容器来实现,而不是在类内部进行对象的创建。这样可以提高代码的灵活性、可测试性和可维护性。

具体实现方式如下:

  1. 创建一个基类,该基类包含一个构造函数,构造函数的参数为IEnumerable<ICustomRepository>类型的参数。
  2. 在派生类中调用基类的构造函数,将对应的IEnumerable<ICustomRepository>参数传递进去。
  3. 在调用基类构造函数的时候,外部容器会自动解析并注入符合IEnumerable<ICustomRepository>类型的所有实现类的实例。
  4. 在基类中可以通过使用依赖注入容器提供的解析方法,来获取具体的ICustomRepository实例。

使用依赖注入的好处是可以动态决定在基类中使用哪个ICustomRepository实例,通过配置依赖注入容器中的映射关系,可以实现灵活的替换和组合不同的实现类。

对于.NET平台的开发,可以使用.NET Core框架提供的依赖注入容器来实现依赖注入。具体步骤如下:

  1. 在.NET Core项目中,添加依赖注入容器的相关NuGet包,例如Microsoft.Extensions.DependencyInjection。
  2. 在Startup类的ConfigureServices方法中,配置依赖注入容器,注册ICustomRepository接口和对应的实现类。
  3. 在基类的构造函数中,使用依赖注入容器提供的IServiceProvider获取IEnumerable<ICustomRepository>实例。

以下是一个示例代码:

代码语言:txt
复制
// 基类
public class MyBaseClass
{
    private readonly IEnumerable<ICustomRepository> _repositories;

    public MyBaseClass(IEnumerable<ICustomRepository> repositories)
    {
        _repositories = repositories;
    }

    // 使用依赖注入容器提供的解析方法,获取ICustomRepository实例
    public void DoSomething()
    {
        foreach (var repository in _repositories)
        {
            repository.DoSomething();
        }
    }
}

// 派生类
public class MyDerivedClass : MyBaseClass
{
    public MyDerivedClass(IEnumerable<ICustomRepository> repositories) : base(repositories)
    {
    }
}

// 接口和实现类
public interface ICustomRepository
{
    void DoSomething();
}

public class CustomRepository1 : ICustomRepository
{
    public void DoSomething()
    {
        // 具体实现
    }
}

public class CustomRepository2 : ICustomRepository
{
    public void DoSomething()
    {
        // 具体实现
    }
}

// Startup类中的配置
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 注册ICustomRepository接口和对应的实现类
        services.AddTransient<ICustomRepository, CustomRepository1>();
        services.AddTransient<ICustomRepository, CustomRepository2>();
        
        // 其他服务的注册
        // ...
    }
}

以上示例中,MyBaseClass通过构造函数注入了IEnumerable<ICustomRepository>,并通过依赖注入容器解析获取到具体的实现类的实例,实现了在基类中使用不同的ICustomRepository实例的需求。

关于腾讯云的相关产品和介绍链接地址,这里不再提及具体品牌商,请通过腾讯云的官方网站或者文档了解相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

asp.net core之依赖注入

按照官方文档的描述: 依赖关系注入通过以下方式解决了这些问题: 使用接口或将依赖关系实现抽象化。 在服务容器中注册依赖关系。...将服务注入使用它的构造函数。 框架负责创建依赖关系的实例,并在不再需要时将其释放。...,这里没用接口注入,直接注入,我们也可以使用接口注入的方式。...服务注册方法 在上面只是用了其中一种注册方法,就是直接注册。 除此之外,我们还可以通过接口注入。...毕竟不容易区分哪些属性是通过注入的,哪些是业务赋值的。 在考虑到继承方面时,有时候属性注入会比构造注入合适,比如在,我们往往可以注入通用的服务,这样在子类的构造器中就无需再次注入该服务。

29920

译 | 你到底有多精通 C# ?

初始化 最佳实践建议尽可能避免构造函数初始化,以防止异常。 所有这些对于静态构造函数来说都更加重要。 您可能知道,当我们尝试在运行时实例化静态构造函数时,它在实例构造函数之前调用。...是的,即使静态构造函数引发异常的可能性很小,也是一个非常糟糕的想法。 派生的初始化顺序 对于派生,初始化顺序更加复杂。在边缘情况下,这可能会给你带来麻烦。...原因是派生的初始化顺序: 首先,实例字段按从派生最远的到的顺序进行初始化。 其次,构造函数按从到派生最远的的顺序调用。...在我们的示例,可以通过直接初始化除数字段而不是在构造函数来解决此问题。 然而,该示例说明了为什么从构造函数调用虚拟方法可能很危险。...不过,我们通常期望单个实例始终使用相同的方法实现,无论它是由哪个类型强制转换的。这样就可以将集合作为,并在集合的所有实例上调用特定方法,从而为要调用的每个类型实现特定的方法。

83640
  • ASP.NET Core 一个接口多个实现的依赖注入与动态选择

    点击蓝字 关注 ASP.NET Core 自带的依赖注入(DI)非常实用,但是当一个接口有多个实现的时候怎么操作呢?运行时能否根据配置选择其中一种实现呢?能不能不用反射呢?...很多小伙伴都有这样的疑问。今天带大家看看如何在ASP.NET Core里不依赖反射,根据配置文件,在运行时动态选择一个接口的具体实现。 首先,这个需求其实来自我自己的博客系统。...HelloerB都注册进去: services.AddTransient(); services.AddTransient(); 构造函数注入...构造函数居然还能这样注入 其实,在ASP.NET Core,当你对一个接口注册了多个实现的时候,构造函数是可以注入一个该接口集合的,这个集合里是所有注册过的实现。...> settings) { Helloers = helloers; AppSettings = settings.Value; } 这样一来,就可以用LINQ非常方便的根据配置文件,从接口集合中选择对应名字的实现

    3.9K30

    ABP入门系列(10)——扩展AbpSession

    Abp对IAbpsession有两个实现方式,一种是NullAbpSession,NullAbpSession是空对象设计模式,用于属性注入时,在构造函数对其初始化。...2、定义IAbpSession扩展获取扩展属性 既然只要我们在登录的时候通过在身份信息添加要扩展的属性,我们就可以通过ClaimsPrincipal获取扩展的属性。...,即可通过ApplicationService, AbpController 和 AbpApiController 这3个已经注入的AbpSession属性调用GetUserEmail()来获取扩展的...五、开始扩展AbpSession(第二种方式) ApplicationService, AbpController 和 AbpApiController 这3个已经注入了AbpSession属性。...使用属性注入IAbpSessionExtension,同样添加以下代码: //隐藏父的AbpSession public new IAbpSessionExtension AbpSession { get

    1.6K60

    在C#中使用依赖注入-三层结构

    本文件将对“如何在三层结构中使用依赖注入”进行介绍。...IStudentDal 这种方式称为“构造函数注入” * 使用构造函数注入的方式,使得不依赖于特定的 IStudentDal 实现。...与版本1相比,通过定义接口和使用构造函数注入实现了BLL和DAL层的解耦。实现了DAL层的切换,这个过程没有修改StudentBll代码。...IStudentDal 这种方式称为“构造函数注入” * 使用构造函数注入的方式,使得不依赖于特定的 IStudentDal 实现。...与版本2相比,只修改了Run的代码。因为在实际项目中,之间的依赖关系错综复杂,有时特定的需要注入多个接口,如果采用版本2的做法,则需要频繁修改new的过程。

    1.3K00

    探索MVP(Model-View-Presenter)设计模式在SharePoint平台下的实现

    角色,IoC类似一个工厂(容器),工厂内部注册了很多依赖关系,IoC容器正式使用这种依赖关系从而动态的注入(又称依赖注入)提供你所需要的实例,这样可以有效的实现解耦,即分离关注点。...在团队开发,我们需要的是互相独立,所以需要让负责Presenter的程序员可以使用MockRepository来做测试,这样就不会影响进度了,幸运的是,基于接口的设计,可以让完成这个愿景。...实际上,IoC就是使用IoC容器将传统的控制流(客户端创建服务)倒置过来,将服务注入到客户端代码。...总之一句话,客户端代码能够只依赖接口或者抽象或其他,而不关心运行时由谁来提供具体实现。...根据构造函数动态注入View和Repository public class EmployeePresenter { private IEmployeeView _view;

    1.1K70

    从壹开始学习NetCore 45 ║ 终于解决了事务问题

    3、用 UnitOfWork 接管 SqlguarClient 在泛型仓储 BaseRepository ,我们修改构造函数注入工作单元接口,用来将 sqlsugar 实例统一起来...4、修改每一个仓储的构造函数 上边我们为了实现对 sugar client的控制,在仓储的构造函数注入了IUnitOfWork,但是这样会导致子类的仓储报错,毕竟父构造函数修改了嘛,所以目前有两个方案...: 1、去掉子仓储,只使用泛型仓储,在service层使用 private readonly IRepository _repository; 这种方法。...注入 ISqlSugarClient ,所以就必须依赖注入: // 这里不是引用了命名空间,因为如果引用命名空间的话,会和Microsoft的一个GetTypeInfo存在二义性,所以就直接这么使用了...三、正式使用事务 1、直接操作跨 Service 事务 现在我们就可以使用如何使用事务了,第一个简单粗暴的,就是全部写到 controller 里,已经写好了一个demo,大家来看看: // 依赖注入

    1.1K40

    Asp.net core自定义依赖注入容器,替换自带容器

    (Repository层),而其他层级也或多或少的使用了依赖注入,在这里不过多的对于依赖注入概念上不进行讲解,如果有不了解的同学,可以在微软官网或者在搜索引擎搜索依赖注入相关概念,本文主要讲解如何在asp.net...上图中,我们可以看到Provider是实现了IServiceProvider的接口,并且实现了GetService的方法,可以看到,使用的方式是去用反射去获取自带的ServiceProvider的构造函数...ServiceProvider对象的时候传入了IServiceCollection的对象,这里所包含的就是启动Core程序所需要的依赖的集合,这样我们就可以保证,程序启动的时候是可以正常启动的,然后在运行...,并且构造函数中有一个string类型的参数,用来标记是在容器 注入的时候使用某个名称用来标识这个类型,其次在我们进行获取这个类型的时候需要在参数或者属性用我们定义的第二个特性标记这个参数或者属性是从容器获取的是哪一个名称哪一个类型的对象...,这样就可以实现一个属性注入和一个接口多实现的一个操作。

    86630

    C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④

    01 自定义引导程序 在上一部分,我们讨论了Caliburn.Micro WPF应用程序的最基本配置,并演示了与操作和约定相关的两个简单功能。在这一部分想进一步探讨Bootstrapper。...这些是可能依赖于其他地方的部分,所以我希望它们可以用于注入还注册了容器本身(只是个人喜好)。 配置完容器后,我们需要告诉Caliburn.Micro如何使用它。这就是后面三个覆盖的目的。...就这样!您可以启动并运行MEF,还可以处理引导程序的其他一些关键扩展点。 当然,只要提供“GetInstance”和“GetAllInstances”的实现,就可以使用所需的任何IoC容器。...继承时,应将“false”传递给基构造函数的“useApplication”参数。这允许引导程序在不存在Xaml应用程序实例的情况下正确配置Caliburn.Micro。...一旦被实例化,您就可以像普通一样使用Caliburn.Micro,可能通过调用IWindowManager来显示新的UI。

    93610

    让我们一起写出更有效的CSharp代码吧,少年们!

    CRUD操作,当扩展时,我们如果直接修改文件,那么当下一次数据库修改,再次生成代码时就可能出现代码覆盖等错误,因而在这种情况下我们会考虑使用分布(说实话分布方法,自己也没怎么用过,记得在以前做C+...这是需要注意的是,工具生成和扩展(一般来说名相同,但文件名加上Ext并放入对应层次文件夹)的设计,需要仔细考虑默认构造方法、属性值设置器、事件处理器等成员的构建。...这其实是个很有用的建议,尤其是在构建集成关系复杂的及其派生时,由于子类、父构造方法调用顺序原因,很容造成初始化和赋值的错误,用一个简单的例子来说明这个问题,借用书中的一句原话,"一个对象在其所有构造器执行完成前并没有完整的被构建...这部分在实际也曾犯过相似的错误,需要非常小心。...说实话,在实际也没有这样使用过,之后尝试后再给大家分享。

    1K50

    依赖注入:服务消费

    为了让读者朋友能够更加深刻地理解IServiceProvider在构造函数选择过程采用的策略,我们会采用实例演示的方式对此进行讲述。...我们在一个控制台应用定义了四个服务接口(IFoo、IBar、IBaz和IGux)以及实现它们的四个(Foo、Bar、Baz和Gux)。...根据我们前面介绍的第一个原则(IServiceProvider对象能够提供构造函数的所有参数),Gux的前两个构造函数会成为合法的候选构造函数,那么IServiceProvider最终会选择哪一个呢?...在所有合法的候选构造函数列表,最终被选择出来的构造函数具有这么一个特征:每一个候选构造函数的参数类型集合都是这个构造函数参数类型集合的子集。...如果这样构造函数并不存在,一个InvalidOperationException类型的异常会被抛出来。

    70330

    .NET Core的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活在依赖注入的时候把这两种实现都给注入进了依赖注入容器,但是在服务调用的时候总是获取到最后注入的那个方法的实现...第一种业务只需要对其中一种实现方式进行调用,:业务需要SqlServer数据库的实现就行了。...业务对这两种实现方式都有用到 针对这种情况有如下两种实现方式: 第二种实现方式 其实,在ASP.NET Core,当你对一个接口注册了多个实现的时候,构造函数是可以注入一个该接口集合的,这个集合里是所有注册过的实现...这段话说的自己都感觉拗口。话不多少,开鲁吧!这里将介绍三种实现方式。 根据我们的配置文件设置的key来进行动态的注入。...第二种实现方式,即接口参数的方式这样可以避免上个方法反射所带来的性能损耗。

    1.3K20

    何在 Spring 中使用依赖注入

    结果,您的变得更容易测试,特别是当依赖项位于接口或抽象上时,这允许在单元测试中使用存根或模拟实现。 “好吧好吧,但我还是不明白这一切的要点,请你说得更清楚些?” ...当然,我们的目标是如何在代码中使用他,对吧?因此,让我们看一下这是如何在代码上工作的。...基于构造函数的依赖注入 在基于构造函数的依赖注入的情况下,容器将调用一个构造函数,每个参数代表我们要设置的依赖项。...好吧,建议您使用构造函数注入,因为它允许您将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。Setter 注入应该主要只用于可选的依赖项,这些依赖项可以在中分配合理的默认值。...,直接通过构造就可以了。

    30620

    dotNET Core 3.X 使用 Web API

    3、3.x 引入了新的 JSON API ,新的 JSON API 使用更少的内存,拥有更快的执行速度,引用 using System.Text.Json; 就可以使用,如果需要使用原来的功能,需要引入... 在 3.x 创建控制器后,默认的为 ControllerBase ,该类中提供了 OK、BadRequest 等常用方法给我们使用。...在我们实际开发,通常会自定义添加一个所有 Controller 的基础,一些通用的功能可以放到,比如,对 AutoMapper 的注入,代码如下: public class BaseController...,依赖注入默认是使用构造函数注入,但Controller 可能会因为每个Action用到不一样的 Service 导致很多参数,所以也可以在 Action 注入Service,需要指定。...001,002 这样的字符串,在接口中使用 IEnumerable来进行接收。

    1.6K30

    php设计模式终篇:一文读懂:依赖注入、控制反转、IoC容器

    依赖注入 依赖注入是一种设计方法,下面将从两方面来展开谈谈。 什么是依赖? 某类需要另一个完成某类工作,:A 需要 B 完成特定的工作。...本例举例是在构造函数依赖,除构造方法外其他方法也是一样,并不一定在构造函数。...什么是注入注入 在现实生活顾明思议是 不属于某物体的对象放入某物体,将 A物体 注入到 B物体,:医生给打针、汽车加油、…。...通过依赖注入实现控制反转 资源接口 /** * 资源接口 */ interface Resources { /** * 使用资源 * @return mixed...资源构造函数有传参,则需获取参数再进行实例化。 注:尽管你使用了依赖注入,但也不一定能简单替换依赖。

    1K30

    通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现:路由整合

    基于这个假设,我们在构造函数注入了代表当前承载环境的IHostEnvironment对象,并利用它得到当前的应用名称。...ActionEndpointDataSourceBase类型的构造函数注入了一个IActionDescriptorCollectionProvider对象,我们利用它来获取描述当前应用范围内所有Action...的构造函数除了注入了用于提供Action描述的IActionDescriptorCollectionProvider对象之外,还注入了用于路由模式转换的RoutePatternTransformer对象...由于依赖服务可以直接注入到Controller类型的构造函数,所以我们会利用ActionContext上下文得到针对当前请求的IServiceProvider对象,并利用它来创建Controller对象...由于依赖注入构造函数注入)的编程方式应用到了这些实现类型,所以我们需要在应用启动的时候将它们作为服务注册到依赖注入框架,为此我们定义了如下这个AddMvcControllers扩展方法(该方法模拟的是

    1.2K30

    一篇文带你入门SSM框架Spring开发!精彩干货不间断!

    ,spring定在容器添加的bean属性需要写在,并指明该bean的id和路径,如下: <!...bean属性,那么使用该方法到底该获取哪一个呢?...bean定义的属性名,value是你将要赋予的属性值, 2、通过有参构造并指定属性进行赋值 上面那种方法指定在bean没有有参构造器的情况下进行属性的赋值的方法,那么现在这种方法就是,当bean存在有参构造器时使用的赋值方法...-- 通过有参构造不指定属性进行赋值,但是需要按照构造函数的参数顺序赋值 --> <!...那就是使用索引和属性类型了,使用索引进行赋值时需要使用到index参数,指定要赋值的属性的序号,如对于上面person的构造函数使用index指定元素位置进行赋值。

    1.1K20

    【asp.net core 系列】13 Identity 身份验证入门

    1.2 设置忽略 我们在开发过程,会遇到这样的一组链接或者页面:请求地址同属于一个控制器下,但其中某个地址可以不用用户登录就可以访问。...这个特性的使用没啥可说的,不过需要注意的是,不要与AuthorizeAttribute一起使用。虽然编译上没啥问题,但实际上会对程序员的逻辑照成一定程度的误导。...IsInRole(string role); public virtual void WriteTo(BinaryWriter writer); } 方法和属性有点多,那么我们重点关注一下构造函数以及可以...这里有一个窍门,对于一个陌生的来说,构造函数对于本身是个很重要的特征,我们可以通过构造函数分析出这个需要哪些基础数据。...Cookie里了,那么如何在控制器获取到数据呢: public ClaimsPrincipal User { get; } 在控制器,提供了这样一个属性,当然如果想要正确获取到值的话,需要在 Startup.cs

    98420

    Entity Framework Core 实现全局查询过滤

    微软在 Entity Framework Core 2+ 引入了全局查询过滤器,简化了构建多租户应用程序和实体软删除的复杂度。这篇文章将通过代码的形式对全局过滤查询进行详细的讲解。...接下来我们先来看一个例子,我们假定多个租户使用同一个数据库,同一个Schema,区分租户是根据表的 tId 区分。...我们新建一个项目,在项目中重写 DbContext 上下文里的 OnModelCreating 方法,在这个方法我们使用 HasQueryFilter 方法进行软删除。...首先利用 DependencyContext 获取运行时程序集,将获得的程序集添加到集合,然后查找出继承自 BaseModel 的程序集,如果查找到了就返回,如果没有查找到就实现全局过滤缓存,代码如下...第一步 首先,获取租户 id 和前面对应的实现,并注入到上下文构造函数: public class EFContext : DbContext { public DbSet<Employee

    1.1K10
    领券