1. 在 ASP.NET Core 中,可以使用依赖注入容器注册和解析基类类型并注入子类对象。
下面分两种情况 讲解如何注册有继承关系的类的的依赖注入。
2 普通类
2.1 定义两个普通的有继承关系的类:
public class MyBaseClass
{
// 基类的成员
}
public class MyDerivedClass : MyBaseClass
{
// 子类的成员
}
以.net 6版本为例。通过IServiceCollection 的AddScoped、AddTransient
、 AddSingleton三个函数
注册基类与子类的依赖注入关系。
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)。