按类型访问对象的C#泛型集实现
- 作者: 和女朋友分手后重回段子圈
- 来源: 51数据库
- 2022-10-19
问题描述
我正在进行一个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>。
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
