我在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方法一起使用,因为它是接口而不是类类型。如果我不想在控制器类中创建新对象,该怎么办?
答案 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,因为它可能是在数据库中设置的。