如何简化在类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();
}
}
这是您的体系结构,因此您负责为存储库类型提供属性。有几种方法可以简化代码:
-
有一种较短的书写属性的方法:
ICourseRepository _courseRepository; public ICourseRepository CourseRepository => _courseRepository ?? (_courseRepository = new CourseRepository(_context));
使用C#5或更低版本会更长一点(您需要显式的get访问器)。您也可以使用
Lazy<T>
类型。 -
依赖项注入。你的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));
-
使用T4生成代码。您可以读取项目文件以获得类型列表,然后根据这些信息生成特性。
-
(也许)当C#7可用时,它会生成内置的代码。它是否可用以及具体包含哪些内容仍有待确定。