我正在进行一个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.GetAll();
类似于EntityFrameworkDBContext类中的Set
方法,其目的是使控制器类泛型并以泛型方式执行GET操作。
我如何实现像Set
方法一样从UnitOfWork类中查找存储库对象?
我同意罗伯特·哈维的观点。但是,如果您想要这样做,一种方法是稍微重构一下代码,然后使用反射:
您可以稍微重构一下代码:
public class UnitOfWork : IUnitOfWork
{
public IRepository Books { get; }
public IRepository Catalogues { get; }
public IRepository Set()
{
var allProperties = this.GetType().GetProperties();
var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(IRepository) );
return (IRepository) property.GetValue(this);
}
}
这只是一个初学者/想法,您可以更多地根据您的环境进行调整(优化、个人选项等)。
PS:您编写了类似于EF的Set
";的";,但在代码示例中没有使用";实体类型";来获取存储库。您可以将我的示例进一步简化为检查T并返回T,而不是IRepository
:
public T Set()
{
var allProperties = this.GetType().GetProperties();
var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(T) );
return (T)property.GetValue(this);
}
然而,这似乎很愚蠢。我认为如果您要使用通用存储库&路径,则应该有IRepository
。
这篇关于按类型访问对象的C#泛型集实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持吉威生活!
[英文标题]c# Generic Set<T> implementation to access objects by type
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,如有侵权,请联系QQ:330946442删除。