Как настроить основной сервис .net, который использует общий репозиторий - PullRequest
0 голосов
/ 21 октября 2019

Я создаю общее хранилище данных, используя .netcore 3.0. с EF Core. Как я могу настроить службу, где мне не нужно указывать фактическое имя объекта, например:

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());

            }

        }
    }
}

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вы можете зарегистрировать тип в общем случае, если это то, о чем вы говорите:

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

Это затем добавит Repository<Foo> для IRespository<Foo>, например.

0 голосов
/ 21 октября 2019

Реализация класса Unit of Work, который оборачивает DbContext и создает репозиторий.

...