Как использовать внедрение зависимостей в классе контроллера веб-API для объектов dbset - PullRequest
0 голосов
/ 10 ноября 2018

Я использую DI в своем классе контроллера, как описано здесь . Объект, который я передаю вместе с DI, должен использоваться как dbset.

public class ValuesController : ControllerBase
{
    private readonly RPContext _context;
    private IResource _resource;

    public ValuesController(RPContext context, IResource resource)
    {
        _context = context;
        _resource = resource;
    }

    [HttpPost("{id}/{resourceName}")]
    public void Post([FromRoute] string id, [FromRoute] string resourceName, [FromBody] JObject Request)
    {
        _resource.Id = id;
        _resource.Name = resourceName;
        _resource.Location = (string)Request["location"];
        _context.Resources.Add(_resource);
        _context.SaveChangesAsync();
    }

Я не могу использовать "_resource" в приведенном выше коде с методом Add объекта Dbcontext, потому что это интерфейс, а не тип класса. Как еще я должен делать это, если я не хочу создавать новые объекты в моем классе контроллера?

1 Ответ

0 голосов
/ 10 ноября 2018

Обратите внимание, что IResource - это интерфейс службы , а не объект . Так что IResource не новый объект. Если вам нужен новый объект, вы можете использовать заводской подход:

var resource = _resource.Create();

Чтобы добавить объект в контекст:

[HttpPost("{resourceName}")]
public async Task<IActionResult> Post([FromRoute]string resourceName, [FromBody]JObject Request)
{
    var resource = new Data.Entities.Resource
    {
        Name = resourceName,
        Location = (string)Request["location"]
    };
    _context.Resources.Add(resource);
    _context.SaveChangesAsync();

     return CreatedAtRoute("Get", new { id = resource.Id }, resource.Id);
}

Где результат ссылки на созданный объект.

Я заметил, что вы включили Id для этого запроса. Но создается впечатление, что создан новый ресурс, поэтому я пропустил Id, потому что он, вероятно, установлен в базе данных.

...