Asp.net Core中如何在依赖基类的类型中注入子类对象?如何注册依赖关系?

1. 在 ASP.NET Core 中,可以使用依赖注入容器注册和解析基类类型并注入子类对象。

下面分两种情况 讲解如何注册有继承关系的类的的依赖注入。

2 普通类

2.1 定义两个普通的有继承关系的类:

public class MyBaseClass
{
    // 基类的成员
}

public class MyDerivedClass : MyBaseClass
{
    // 子类的成员
}

以.net 6版本为例。通过IServiceCollection  的AddScoped、AddTransientAddSingleton三个函数 注册基类与子类的依赖注入关系。

2.2 注册依赖注入关系

services.AddScoped<MyBaseClass, MyDerivedClass>(); 

这将告诉容器以 MyDerivedClass 对象替换所有 MyBaseClass 类型的依赖关系。

2.3. 使用依赖注入获取对象。

在应用代码中,需要使用基类类型的地方,通过构造函数注入基类的依赖,但实际上会提供子类的对象。

public class MyController : Controller
{
    private readonly MyBaseClass _myBaseObject;

    public MyController(MyBaseClass myBaseObject)
    {
        _myBaseObject = myBaseObject;
    }

    // 使用 _myBaseObject
}

以上代码中,当在控制器中使用 _myBaseObject 时,实际上使用的是 MyDerivedClass 的实例,因为容器已经注册了这种映射。

通过调用IServiceCollection.AddXXX<BaseClass, DerivedClass>()这种方式可以实现 基类子类的依赖注入关系。XXX 代表 Scoped、Transient、Singleton之一。

3 泛型类

3.1 定义两个泛型的有继承关系的类

public class MyBaseService<T>
{
    public T GetResult()
    {
        // 基类泛型服务的实现
        return default(T);
    }
}

public class MyDerivedService<T> : MyBaseService<T>
{
    public T GetDerivedResult()
    {
        // 继承泛型服务的实现
        return default(T);
    }
}

3.2 注册泛型类的依赖注入关系

创建一个工厂方法,以便容器能够解析泛型类的实例。这是一种通用的工厂方法,它接受类型参数,并返回相应的泛型类实例。

public MyBaseService<T> CreateMyService<T>()
{
    // 根据 T 的具体类型返回适当的泛型类实例
    return new MyDerivedService<T>();
}


services.AddScoped(typeof(MyBaseService<>), serviceProvider =>
{
    // 使用工厂方法创建泛型类实例
    var factory = serviceProvider.GetRequiredService<Func<Type, object>>();
    return factory(typeof(MyDerivedService<>));
});

3.3 使用依赖注入

public class MyController : Controller
{
    private readonly MyBaseService<int> _myService;

    public MyController(MyBaseService<int> myService)
    {
        _myService = myService;
    }

    // 使用 _myService
}

这种方法允许您在 ASP.NET Core 中注册和解析具有继承关系的泛型类。您需要工厂方法来创建适当的泛型类实例,同时使用类型参数约束确保正确的泛型类型被注入。这使您能够根据需要处理泛型类的依赖关系。

在注册依赖关系时,可以根据需求选择适当的生命周期(Scoped、Transient、Singleton)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值