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

时间:2016-07-30 18:10:33

标签: c# unit-of-work

忽略实体框架中的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();
        }

    }

1 个答案:

答案 0 :(得分:1)

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

  1. 编写属性的方法较短:

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

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

  2. 依赖注入。你的吸气器将如下所示:

    _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可用时内置代码生成。它是否可用以及究竟将包含哪些内容仍然是TBD。