c# - 如何设置使用通用存储库的 .net 核心服务
问题描述
我正在使用 .netcore 3.0 构建一个通用数据存储库。与 EF 核心。如何在不必提供实际实体名称的情况下设置服务,例如:
services.AddScoped<RepositoryBase<Feature>>();
有没有办法配置所有我都可以这样做的选项?
这些主要是 CRUD 操作。
通用存储库基础
namespace CoreAPI1.Data.Services
{
public class RepositoryBase<TEntity> where TEntity : class
{
private readonly DbContext _context;
private readonly DbSet<TEntity> _dbSet;
public RepositoryBase(DbContext context)
{
_context = context;
if (_context == null)
throw new ArgumentNullException();
_dbSet = context.Set<TEntity>();
}
public async Task<IEnumerable<TEntity>> GetAll()
{
return _dbSet.AsNoTracking().ToList();
}
}
}
服务
public static void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TruckContext>(ServiceLifetime.Scoped);
services.AddScoped<IFileService, FileService>();
services.AddScoped<IImageRepository, ImageRepository>();
services.AddScoped<RepositoryBase<Feature>>();
services.AddControllers();
// services.AddAutoMapper(typeof(Truck));
services.AddMvc(_x=>_x.EnableEndpointRouting =
false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}
调用控制器
namespace CoreAPI1.Data.Controllers
{
[Route("api/features")]
[ApiController]
public class FeaturesController :ControllerBase
{
private RepositoryBase<Data.Entities.Feature> _repository;
private IMapper _mapper;
public FeaturesController(RepositoryBase<Data.Entities.Feature> repository, IMapper mapper)
{
_repository = repository ?? throw new ArgumentNullException(nameof(_repository));
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
}
[HttpGet]
public async Task<IEnumerable<Domain.Models.Feature>> GetFeatures()
{
var _features = await _repository.GetAllAsync();
List<Domain.Models.Feature> _returnedFeatures = new List<Domain.Models.Feature>();
try
{
foreach (var f in _features)
{
var _returnedFeature = _mapper.Map<Domain.Models.Feature>(f);
_returnedFeatures.Add(_returnedFeature);
}
return _returnedFeatures;
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
}
}
}
解决方案
如果这就是您所说的,您可以一般地注册类型:
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
例如,这将注入Repository<Foo>
for IRespository<Foo>
。
推荐阅读
- laravel - 如何在 laravel 刀片视图中构造 vue.js 组件
- python - 在数据框中追加行?
- typescript - 在打字稿中使用异步等待来等待承诺
- python - 使用正则表达式忽略包含子字符串的单词
- javascript - componentDidUpdate 未正确触发
- javascript - 如何在正则表达式中启用向密码验证添加特殊字符
- ruby - Ampersand 如何将参数作为“obj”传递给#to_proc?—receiving_method(&:method)
- python-3.x - pyqt5,循环 QtWidgets
- javascript - 为什么 openlayers 地图在 vue-cli 3 中不起作用
- java - 注册没有@Bean注解的FilterRegistrationBean