问题描述
我正在进行一个Net Core WebApi项目,并实现工作单元模式以访问数据库中的记录。
考虑以下课程:
工作单位:
public class UnitOfWork : IUnitOfWork { public IBooksRepository Books { get; } public ICatalogueRepository Catalogues { get; } ... }
Api控制器:
public class StudentController: ApiController { private IUnitOfWork _unitOfWork; public StudentController(IUnitOfWork UnitOfWork) { _unitOfWork = UnitOfWork; } public IActionResult Get() { var books = _unitOfWork.Books.GetAll(); return Ok(books); } }
}
目前我正在使用上述方法从数据库中检索记录, 我希望访问存储库对象,如下所示。var books = _unitOfWork.Set<IBooksRepository>.GetAll();
类似于EntityFrameworkDBContext类中的Set<T>方法,其目的是使控制器类泛型并以泛型方式执行GET操作。
我如何实现像Set<T>方法一样从UnitOfWork类中查找存储库对象?
推荐答案
我同意罗伯特·哈维的观点。但是,如果您想要这样做,一种方法是稍微重构一下代码,然后使用反射:
您可以稍微重构一下代码:
public class UnitOfWork : IUnitOfWork { public IRepository<Book> Books { get; } public IRepository<Catalogue> Catalogues { get; } public IRepository<T> Set<T>() { var allProperties = this.GetType().GetProperties(); var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(IRepository<T>) ); return (IRepository<T>) property.GetValue(this); } }
这只是一个初学者/想法,您可以更多地根据您的环境进行调整(优化、个人选项等)。
PS:您编写了类似于EF的Set<T>";的";,但在代码示例中没有使用";实体类型";来获取存储库。您可以将我的示例进一步简化为检查T并返回T,而不是IRepository<T>:public T Set<T>() { var allProperties = this.GetType().GetProperties(); var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(T) ); return (T)property.GetValue(this); }
然而,这似乎很愚蠢。我认为如果您要使用通用存储库&路径,则应该有IRepository<T>。