Могу ли я создать один контроллер, такой как Laravel Resource Controller, в ASP.NET Core? - PullRequest
0 голосов
/ 24 июня 2019

Итак, у меня есть, например, такой код контроллера ресурсов Laravel:

class BaseAPIController extends Controller
{
    public function index()
    {
        return self::$model->all();
    }
}

Итак, я пытался сделать это в ASP.NET C #:

[ApiController]
public class BaseAPIController<T> : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<T>> Get()
    {
        using (ExamRTContext db = new ExamRTContext())
        {
            return db.${typeof(T).Name}.Select(x => x);
        }
    }
}

Но я понятия не имею, как это сделать.

Итак, допустим, я просто хотел сделать простой CRUD в 3 таблицах. Все операции одинаковы, например, Get () используется для получения всех данных из этой модели.

Вместо того, чтобы писать 3 раза, я хотел просто написать один раз и распространить его на каждый контроллер модели.

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Если вы хотите выполнять простые CRUD-операции с платформой сущностей, вы можете создать общий репозиторий.

Репозиторий:

    public class GenericRepository<TEntity, TContext>
        where TContext : DbContext
        where TEntity : class
    {
        protected readonly TContext context;

        public GenericRepository(TContext context)
        {
            this.context = context;
        }

        public virtual async Task Add(TEntity model)
        {
            await context.Set<TEntity>().AddAsync(model);
            await context.SaveChangesAsync();
        }

        public virtual async Task<TEntity> Get(int id)
        {
            return await context.Set<TEntity>().FindAsync(id);
        }

        public virtual async Task<IEnumerable<TEntity>> GetAll()
        {
            return await context.Set<TEntity>().ToListAsync();
        }

        public virtual async Task<TEntity> FindFirstBy(Func<TEntity,bool> predicate)
        {
            return await Task.Run(()=> context.Set<TEntity>().FirstOrDefault(predicate));
        }

        public virtual async Task<IEnumerable<TEntity>> FilterBy(Func<TEntity,bool> predicate)
        {
            return await Task.Run(()=> context.Set<TEntity>().Where(predicate).ToList());
        }

        public virtual async Task Update()
        {
            await context.SaveChangesAsync();
        }

        public virtual async Task Remove(TEntity model)
        {
            context.Set<TEntity>().Remove(model);
            await context.SaveChangesAsync();
        }
    }

Чтобы использовать еговам просто нужно вставить его в контроллер, указав тип сущности и контекст.В вашем примере это будет выглядеть так:

База контроллеров:

[ApiController]
public class BaseAPIController<T> : ControllerBase
{
    protected readonly GenericReposoitory<T,ExamRTContext> repository;

    public BaseAPIController(GenericRepository<T,ExamRTContext> repository) {
        this.repository = repository;
    }

    [HttpGet]
    public ActionResult<IEnumerable<T>> Get()
    {
        var entities = repository.GetAll();
        if (entities!= null) {
            return Ok(entities);
        }
        return NotFound();
    }
}

При запуске:

services.AddTransient(typeof(GenericRepository<,>), typeof(GenericRepository<,>));
0 голосов
/ 24 июня 2019

C # не позволяет вам составлять выражения во время выполнения.

Однако для этого у EF есть API.
Вы ищете .Set<T>().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...