首页 > 解决方案 > 如何设置使用通用存储库的 .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());

            }

        }
    }
}

标签: c#asp.net-coredependency-injection

解决方案


如果这就是您所说的,您可以一般地注册类型:

services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

例如,这将注入Repository<Foo>for IRespository<Foo>


推荐阅读