忽略实体框架中的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();
}
}
答案 0 :(得分:1)
这是您的架构,因此您负责为您的存储库类型提供属性。有几种简化代码的方法:
编写属性的方法较短:
ICourseRepository _courseRepository;
public ICourseRepository CourseRepository =>
_courseRepository ?? (_courseRepository = new CourseRepository(_context));
C#5或更低版本会更长一些(你需要显式的get访问器)。您也可以使用Lazy<T>
类型。
依赖注入。你的吸气器将如下所示:
_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可用时内置代码生成。它是否可用以及究竟将包含哪些内容仍然是TBD。