sách gpt4 ai đã đi

Tự động đăng ký các lớp thực thể vào ngữ cảnh EntityFrameworkCore và thích ứng với ABP và ABPVNext

In lại Tác giả: Tôi là một chú chim nhỏ Thời gian cập nhật: 2022-11-26 06:42:14 35 4
mua khóa gpt4 Nike

Tiếp theo bài viết trước (EF Core lazy tips to reject DbSet), tác giả gần đây đã đóng gói hàm nhỏ này thành một phương thức mở rộng và mã nguồn mở. Chào mừng bạn đến với communicate và Star~.

GitHub: EntityFrameworkCore.Extension.AutoMapping .

Nuget: EntityFrameworkCore.Extension.AutoMapping .

              EntityFrameworkCore.Extension.AutoMapping.Abp.

              EntityFrameworkCore.Extension.AutoMapping.AbpVNext.

Cách sử dụng

Ghi đè phương thức OnModelCreating trong DbContext.cs:

                        
                          using EntityFrameworkCore.Extension; ... //Các mã khác được bỏ qua ở đâypublic class XmateDbContext:DbContext { ... //Các mã khác được bỏ qua ở đâyprotected override void OnModelCreating(ModelBuilder modelBuilder) { var modelAssemblyName = "XMate.Models";//Tên của thư viện lớp nơi lớp thực thể được đặt, không bao gồm phần mở rộng (.dll) modelBuilder.AutoMappingEntityTypes(modelAssemblyName);//Generic IEntity là kiểu đặc tả của tất cả các lớp thực thểbase.OnModelCreating(modelBuilder);//Điều này phải được thêm vào, nếu không sẽ báo lỗi...//Các mã khác được bỏ qua ở đây} }

                        
                      

Theo cách này, chúng ta không cần phải viết toàn màn hình DbSet. Tuy nhiên, một số vấn đề mới có thể phát sinh trong một số khuôn khổ của bên thứ ba. . . Ví dụ, trong khuôn khổ ABP hoặc VNext, những người đã sử dụng khuôn khổ ABP sẽ biết rằng ABP tự động đăng ký kho lưu trữ lớp thực thể trong vùng chứa IOC bằng cách quét DbSet trong DbContext. Bây giờ chúng ta cần tự mình thực hiện:

                        
                              public static class AutoRegisterEntityRepositoryExtensions { ///  /// Tiêm kho lưu trữ tương ứng với kiểu thực thể của bảng dữ liệu vào vùng chứa IOC///  ///  public static void RegisterDbEntityRepositories(this IIocManager iocManager, string modelAssemblyName) where TDbContext : DbContext { foreach (var entityType in GetDbEntityType(typeof(IEntity<>), modelAssemblyName)) { var keyType = entityType.GetInterfaces().Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEntity<>)).SelectMany(t => t.GetGenericArguments()).First(); var genericRepositoryType = typeof(IRepository<,>).MakeGenericType(entityType, keyType); impType = typeof(EfCoreRepositoryBase<,,>).MakeGenericType(typeof(TDbContext), entityType, keyType); iocManager.RegisterIfNot(genericRepositoryType, impType, lifeStyle: DependencyLifeStyle.Transient); } } ///  /// Lấy danh sách các kiểu thực thể trong bảng dữ liệu///  /// Kiểu ràng buộc định nghĩa thực thể /// Tên của dll nơi lớp thực thể được đặt, không có hậu tố (.dll) ///  private static List GetDbEntityType(Type constraintsType, string modelAssemblyName) { var all = AppDomain.CurrentDomain.GetAssemblies(); var types = all.WhereIf(!modelAssemblyName.IsNullOrWhiteSpace(), a => a.FullName.Contains(modelAssemblyName)).SelectMany(m => m.GetTypes().Where(t => t.IsClass && !t.IsAbstract && (t.IsImplement(constraintType) || t.IsSubclass(constraintType))).ToList()).Distinct().ToList(); trả về các kiểu.Where(t => !t.GetCustomAttributes().Any()).ToList(); } }

                        
                      

Lưu ý: Mã trên được trích xuất từ: AutoRegisterEntityRepositoryExtensions.cs.

Ý tưởng triển khai trong ABP VNext cũng vậy. Tôi sẽ không đăng mã ở đây. Nếu bạn quan tâm, bạn có thể tham khảo mã nguồn.

Triển khai việc tự động tiêm Repository tương ứng với lớp thực thể trong Abp

                        
                          using EntityFrameworkCore.Extension.AutoMapping.Abp; ... //Các mã khác bị lược bỏ ở đây public class XmateModule:AbpModule { ... //Các mã khác bị lược bỏ ở đây //Viết lại phương thức Initialize public override void Initialize() { ... //Các mã khác bị lược bỏ ở đây var modelAssemblyName = "XMate.Models"; //Tên của thư viện lớp nơi lớp thực thể được đặt, không có phần mở rộng (.dll) IocManager.RegisterDbEntityRepositories(modelAssemblyName); } }


                        
                      

Triển khai tự động chèn Repository tương ứng với lớp thực thể trong Abp VNext

                        
                          using EntityFrameworkCore.Extension.AutoMapping.AbpVNext; ... //Các mã khác bị lược bỏ ở đây public class XmateModule:AbpModule { ... //Các mã khác bị lược bỏ ở đây //Viết lại phương thức ConfigureServices public override void ConfigureServices(ServiceConfigurationContext context) { ... //Các mã khác bị lược bỏ ở đây var modelAssemblyName = "XMate.Models"; //Tên của thư viện lớp nơi lớp thực thể được đặt, không bao gồm phần mở rộng (.dll) context.Services.RegisterDbEntityRepositories(modelAssemblyName); } }


                        
                      

Cuối cùng, bài viết này về việc tự động đăng ký các lớp thực thể vào ngữ cảnh EntityFrameworkCore và thích ứng với ABP và ABPVNext đã kết thúc. Nếu bạn muốn biết thêm về việc tự động đăng ký các lớp thực thể vào ngữ cảnh EntityFrameworkCore và thích ứng với ABP và ABPVNext, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

35 4 0
Tôi là một chú chim nhỏ
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com