How to use dependency injection in web api controller class for dbset objects
up vote
1
down vote
favorite
I am use DI in my controller class as documented here. The object I am passing with DI has to be used as 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();
}
I cannot use "_resource" in the above code with the Add method of Dbcontext object because it is an interface and not of class type. How else should I be doing this if I don't want to create new objects in my controller class?
entity-framework asp.net-core dependency-injection entity-framework-core
add a comment |
up vote
1
down vote
favorite
I am use DI in my controller class as documented here. The object I am passing with DI has to be used as 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();
}
I cannot use "_resource" in the above code with the Add method of Dbcontext object because it is an interface and not of class type. How else should I be doing this if I don't want to create new objects in my controller class?
entity-framework asp.net-core dependency-injection entity-framework-core
This question contains a LOT of things:1.
The controller inherit toControllerBase
instead ofController
.2.
Using asynchronous task but returningvoid
.3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).
– Foo
Nov 10 at 7:34
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits fromController
, not justControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits fromController
.
– Foo
Nov 10 at 14:45
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I am use DI in my controller class as documented here. The object I am passing with DI has to be used as 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();
}
I cannot use "_resource" in the above code with the Add method of Dbcontext object because it is an interface and not of class type. How else should I be doing this if I don't want to create new objects in my controller class?
entity-framework asp.net-core dependency-injection entity-framework-core
I am use DI in my controller class as documented here. The object I am passing with DI has to be used as 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();
}
I cannot use "_resource" in the above code with the Add method of Dbcontext object because it is an interface and not of class type. How else should I be doing this if I don't want to create new objects in my controller class?
entity-framework asp.net-core dependency-injection entity-framework-core
entity-framework asp.net-core dependency-injection entity-framework-core
edited Nov 10 at 9:48
asked Nov 10 at 5:03
user1097128
289
289
This question contains a LOT of things:1.
The controller inherit toControllerBase
instead ofController
.2.
Using asynchronous task but returningvoid
.3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).
– Foo
Nov 10 at 7:34
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits fromController
, not justControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits fromController
.
– Foo
Nov 10 at 14:45
add a comment |
This question contains a LOT of things:1.
The controller inherit toControllerBase
instead ofController
.2.
Using asynchronous task but returningvoid
.3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).
– Foo
Nov 10 at 7:34
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits fromController
, not justControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits fromController
.
– Foo
Nov 10 at 14:45
This question contains a LOT of things:
1.
The controller inherit to ControllerBase
instead of Controller
. 2.
Using asynchronous task but returning void
. 3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).– Foo
Nov 10 at 7:34
This question contains a LOT of things:
1.
The controller inherit to ControllerBase
instead of Controller
. 2.
Using asynchronous task but returning void
. 3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).– Foo
Nov 10 at 7:34
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits from
Controller
, not just ControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits from Controller
.– Foo
Nov 10 at 14:45
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits from
Controller
, not just ControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits from Controller
.– Foo
Nov 10 at 14:45
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
Please note that IResource
is the interface of a service, not an object itself. So IResource isn't a new object. If you need a new object you can take a factory approach:
var resource = _resource.Create();
To add an entity to the context:
[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);
}
Where the result links to the created object.
I noticed that you've included an Id for this request. But it seems that a new resource is created, so I've omitted the Id because it is probably set in the database.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53236137%2fhow-to-use-dependency-injection-in-web-api-controller-class-for-dbset-objects%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
Please note that IResource
is the interface of a service, not an object itself. So IResource isn't a new object. If you need a new object you can take a factory approach:
var resource = _resource.Create();
To add an entity to the context:
[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);
}
Where the result links to the created object.
I noticed that you've included an Id for this request. But it seems that a new resource is created, so I've omitted the Id because it is probably set in the database.
add a comment |
up vote
1
down vote
Please note that IResource
is the interface of a service, not an object itself. So IResource isn't a new object. If you need a new object you can take a factory approach:
var resource = _resource.Create();
To add an entity to the context:
[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);
}
Where the result links to the created object.
I noticed that you've included an Id for this request. But it seems that a new resource is created, so I've omitted the Id because it is probably set in the database.
add a comment |
up vote
1
down vote
up vote
1
down vote
Please note that IResource
is the interface of a service, not an object itself. So IResource isn't a new object. If you need a new object you can take a factory approach:
var resource = _resource.Create();
To add an entity to the context:
[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);
}
Where the result links to the created object.
I noticed that you've included an Id for this request. But it seems that a new resource is created, so I've omitted the Id because it is probably set in the database.
Please note that IResource
is the interface of a service, not an object itself. So IResource isn't a new object. If you need a new object you can take a factory approach:
var resource = _resource.Create();
To add an entity to the context:
[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);
}
Where the result links to the created object.
I noticed that you've included an Id for this request. But it seems that a new resource is created, so I've omitted the Id because it is probably set in the database.
answered Nov 10 at 14:25
Ruard van Elburg
5,09321125
5,09321125
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53236137%2fhow-to-use-dependency-injection-in-web-api-controller-class-for-dbset-objects%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
This question contains a LOT of things:
1.
The controller inherit toControllerBase
instead ofController
.2.
Using asynchronous task but returningvoid
.3.
Try to cast an interface to a class... I suggest you to read the documentation careful and follow step-by-step to understand how it works. Or just download the project and run (via the link you provide).– Foo
Nov 10 at 7:34
async was a copy-paste mistake made while adding code here from older version, removed it. When you create web api project through Visual Studio, it only inerits from controllerbase. Seems like Controller is for MVC views and models which I don't need.
– user1097128
Nov 10 at 9:53
@TânNguyễn About ControllerBase: docs.microsoft.com/nl-nl/aspnet/core/web-api/…
– Ruard van Elburg
Nov 10 at 14:04
@RuardvanElburg Indeed, we can use almost everything in Web API with a class that inherits from
Controller
, not justControllerBase
(I'm sure). And the question about the difference(s) may be in another post. I said that because: when I create new controller in my project (.net core 2.1), it inherits fromController
.– Foo
Nov 10 at 14:45