戳戳猫的小窝
更新日志
关于
仓库基类无法直接使用(最好不要直接使用),需要根据模型创建具体的仓库类。 # 创建仓库类 在Repositories文件夹下创建4个类文件: - **MajorRepo.cs** - **GradeRepo.cs** - **ClassRepo.cs** - **StudentRepo.cs** # 继承仓库基类 以**MajorRepo**为例。 首先通过冒号继承**BaseRepository**,并指定**Major**作为泛型的具体类。 代码如下: ``` public class MajorRepo : BaseRepository<Major> { } ``` 其次,由于**BaseRepository**需要有一个带参数的构造函数注入**AppDbContext**的**实例**,因此**MajorRepo**也需要有一个同样参数列表的构造函数。 代码如下: ``` public class MajorRepo(AppDbContext context) : BaseRepository<Major> { } ``` 最后,需要将构造函数的参数传递给基类,这样,在创建**MajorRepo**的实例时,就可以将**AppDbContext**的实例传递给父类**BaseRepository**。 代码如下: ``` public class MajorRepo(AppDbContext context) : BaseRepository<Major>(context) { } ``` 至此Major的仓库类就可以使用了。 其他模型的仓库类代码如下所示: GradeRepo.cs ``` public class GradeRepo(AppDbContext context) : BaseRepository<Grade>(context) { } ``` ClassRepo.cs ``` public class ClassRepo(AppDbContext context) : BaseRepository<Class>(context) { } ``` StudentRepo.cs ``` public class StudentRepo(AppDbContext context) : BaseRepository<Student>(context) { } ``` # 注册服务 为了更加方便地让其他组件获取仓库实例,可以将仓库注册为服务。 具体方法是在**Program.cs**中通过**AddScoped**方法将仓库添加为服务。 代码如下: ``` public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); IServiceCollection services = builder.Services; services.AddControllersWithViews(); services.AddDbContext<AppDbContext>(); services.AddScoped<MajorRepo>(); services.AddScoped<GradeRepo>(); services.AddScoped<ClassRepo>(); services.AddScoped<StudentRepo>(); var app = builder.Build(); app.UseStaticFiles(); app.MapDefaultControllerRoute(); app.Run(); } ``` 这样就相当于将MajorRepo这四个仓库类放到一个货架上,等待顾客下单。 # 依赖注入 除了**AddScoped**方法,还有2个方法可以将类注册为服务,分别是**AddTransient**和**AddSingleton**。 如果将类比喻成商品,那么**Singleton**、**Scoped**和**AddTransient**就相当于它们的保质期。 **Singleton**:保质期最长,随着项目的启动而产生,随着项目的关闭而消亡。 **Scoped**:保质期一般,在一次用户的请求内产生和消亡。 **AddTransient**:保质期极短,在产生后完成使命后便消失了。 > Question: > > #### 为什么不将MajorRepo等仓库类注册为保质期最长的Singleton服务? 因为**AddDbContext**会将**AppDbContext**注册为**Scoped**类型的服务。 而**MajorRepo**中依赖**AppDbContext**,因此**MajorRepo**的保质期不能设置得比**Scoped**长,只能**保持一致**或**更短**。 还是换成商品来举例,一件商品的保质期不可能比它的配料的保质期长,因为配料坏了,商品也就坏了。 在这里**MajorRepo**就相当于商品,而**AppDbContext**相当于配料。
仓库类