开放泛型模式

开放泛型模式(Open Generic)是一种允许用户在 DI 容器中注册和解析泛型类型的模式。这种模式常用于需要动态创建和管理泛型类型的场景,例如使用仓储模式访问多个数据源的场景。通过注册泛型类型,用户可以根据需要动态创建对象,并将其注入到依赖项中。示例代码如下:

// 注册泛型仓储
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

// 使用泛型仓储
public class MyService<T>
{
    private readonly IRepository<T> _repository;

    public MyService(IRepository<T> repository)
    {
        _repository = repository;
    }
}

泛型限定模式

泛型限定(Generic Constraints)模式是指在使用泛型类型作为依赖项时,限定泛型类型必须满足某些条件。例如,假设我们有一个泛型类型的服务,它依赖于一个支持增删改查操作的仓储。我们可以通过泛型限定模式,将泛型参数限定为必须实现 IRepository 接口,从而保证仓储的一致性。示例代码如下:

// IRepository 接口定义
public interface IRepository<T>
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    T GetById(int id);
}

// MyService 依赖于 IRepository 接口
public class MyService<T> where T : class, IRepository<T>
{
    private readonly T _repository;

    public MyService(T repository)
    {
        _repository = repository;
    }

    public void DoSomething()
    {
        // ...
    }
}

// 注册 MyService
services.AddScoped(typeof(MyService<>));

// 注册 IRepository 的实现
services.AddScoped(typeof(IRepository<>), typeof(MyRepository<>));

在上述示例中,MyService 类通过泛型限定模式,将泛型参数 T 限定为必须实现 IRepository 接口。这样做可以保证在运行时,仓储实现类能够被正确注入到 MyService 类中。