如何在Web API控制器类中为dbset对象使用依赖项注入

时间:2018-11-10 05:03:39

标签: entity-framework asp.net-core dependency-injection entity-framework-core

我在here中所述的控制器类中使用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”与Dbcontext对象的Add方法一起使用,因为它是接口而不是类类型。如果我不想在控制器类中创建新对象,该怎么办?

1 个答案:

答案 0 :(得分:1)

请注意,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,因为它可能是在数据库中设置的。