【问题标题】:How simplify creating repositories in class UnitOfWork?如何简化在 UnitOfWork 类中创建存储库?
【发布时间】:2016-07-30 18:10:33
【问题描述】:

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

    }

【问题讨论】:

    标签: c# unit-of-work


    【解决方案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 中内置的代码生成功能可用时。它是否可用以及具体包含什么仍待定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多