如何简化在类UnitOfWork中创建存储库

本文关键字:创建 存储 UnitOfWork 何简化 | 更新日期: 2023-09-27 17:59:16

忽略实体框架中的DbContext现在是工作单元这一事实。我想知道如何简化在类UnitOfWork中创建存储库,因为现在每次创建新的存储库类时都必须向该类添加属性?我不想要通用存储库类。

public class UnitOfWork
    {
        private SchoolContext _context = new SchoolContext();
        private IDepartmentRepository _departmentRepository;
        private ICourseRepository _courseRepository;
        public IDepartmentRepository DepartmentRepository
        {
            get
            {
                if (this._departmentRepository == null)
                {
                    this._departmentRepository = new DepartmentRepository(_context);
                }
                return _departmentRepository;
            }
        }
        public ICourseRepository CourseRepository
        {
            get
            {
                if (this._courseRepository == null)
                {
                    this._courseRepository = new CourseRepository(_context);
                }
                return _courseRepository;
            }
        }
        public void Save()
        {
            _context.SaveChanges();
        }
    }

如何简化在类UnitOfWork中创建存储库

这是您的体系结构,因此您负责为存储库类型提供属性。有几种方法可以简化代码:

  1. 有一种较短的书写属性的方法:

    ICourseRepository _courseRepository;
    public ICourseRepository CourseRepository =>
        _courseRepository ?? (_courseRepository = new CourseRepository(_context));
    

    使用C#5或更低版本会更长一点(您需要显式的get访问器)。您也可以使用Lazy<T>类型。

  2. 依赖项注入。你的getter看起来是这样的:

    _someDI.Get<ICourseRepository>(new Parameter(_context));
    

    你需要先注册你的类型,如下所示:

    _someDI.Register<ICourseRepository, CourseRepository>();
    

    或所有类型加在一起:

    _someDI.RegisterAllImplementingInterface<IBaseRepository>().AsImplementingInterfaces();
    

    它还将使使用单一方法成为可能,尽管类型将不太容易被发现:

    TRep GetRepository<TRep>() where TRep : IBaseRepository =>
        _someDI.Get<TRep>(new Parameter(_context));
    
  3. 使用T4生成代码。您可以读取项目文件以获得类型列表,然后根据这些信息生成特性。

  4. (也许)当C#7可用时,它会生成内置的代码。它是否可用以及具体包含哪些内容仍有待确定。