ASP.NET MVC 5: Inject a repository into an IValidatableObject
I have a class that implements the IValidatableObject
interface, in order to validate the incoming data introduced by the user. The problem is that in order to validate that data, I need to use a class that implements the data repository pattern, which is in another assembly. Something like this:
public class SelectedFilteringCriteria : IValidatableObject
{
private IFiltersRepository _filtersRepository;
public SelectedFilteringCriteria(IFiltersRepository filtersRepository)
{
_filtersRepository = filtersRepository;
}
public int? SelectedValue { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var valueOk = _filtersRepository.GetFilters().Any(
filter => filter.Value == SelectedValue
);
if (!valueOk)
{
results.Add(new ValidationResult("Not good :("));
}
return results;
}
}
The dependency container I'm using is Ninject. I would like to know if there's a way to tell MVC to inject the repository class into the IValidatableObject
when it's going to be created.
asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc
|
show 1 more comment
I have a class that implements the IValidatableObject
interface, in order to validate the incoming data introduced by the user. The problem is that in order to validate that data, I need to use a class that implements the data repository pattern, which is in another assembly. Something like this:
public class SelectedFilteringCriteria : IValidatableObject
{
private IFiltersRepository _filtersRepository;
public SelectedFilteringCriteria(IFiltersRepository filtersRepository)
{
_filtersRepository = filtersRepository;
}
public int? SelectedValue { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var valueOk = _filtersRepository.GetFilters().Any(
filter => filter.Value == SelectedValue
);
if (!valueOk)
{
results.Add(new ValidationResult("Not good :("));
}
return results;
}
}
The dependency container I'm using is Ninject. I would like to know if there's a way to tell MVC to inject the repository class into the IValidatableObject
when it's going to be created.
asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in theNinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.
– amedina
Nov 15 '18 at 7:47
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete classSelectedFilteringCriteria
whereas you mentioned trying to inject it into an interfaceIValidatableObject
. What is wrong with injecting your repo interface into the concrete classSelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help
– GregH
Nov 15 '18 at 13:03
if you have multiple classes which inherit fromIValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something likeSelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected intoBaseCriteria
so that all classes which inherit from it have access to your repo
– GregH
Nov 15 '18 at 13:05
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:FiltersRepository
must be injected intoSelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates theSelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?
– amedina
Nov 15 '18 at 13:35
|
show 1 more comment
I have a class that implements the IValidatableObject
interface, in order to validate the incoming data introduced by the user. The problem is that in order to validate that data, I need to use a class that implements the data repository pattern, which is in another assembly. Something like this:
public class SelectedFilteringCriteria : IValidatableObject
{
private IFiltersRepository _filtersRepository;
public SelectedFilteringCriteria(IFiltersRepository filtersRepository)
{
_filtersRepository = filtersRepository;
}
public int? SelectedValue { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var valueOk = _filtersRepository.GetFilters().Any(
filter => filter.Value == SelectedValue
);
if (!valueOk)
{
results.Add(new ValidationResult("Not good :("));
}
return results;
}
}
The dependency container I'm using is Ninject. I would like to know if there's a way to tell MVC to inject the repository class into the IValidatableObject
when it's going to be created.
asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc
I have a class that implements the IValidatableObject
interface, in order to validate the incoming data introduced by the user. The problem is that in order to validate that data, I need to use a class that implements the data repository pattern, which is in another assembly. Something like this:
public class SelectedFilteringCriteria : IValidatableObject
{
private IFiltersRepository _filtersRepository;
public SelectedFilteringCriteria(IFiltersRepository filtersRepository)
{
_filtersRepository = filtersRepository;
}
public int? SelectedValue { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var valueOk = _filtersRepository.GetFilters().Any(
filter => filter.Value == SelectedValue
);
if (!valueOk)
{
results.Add(new ValidationResult("Not good :("));
}
return results;
}
}
The dependency container I'm using is Ninject. I would like to know if there's a way to tell MVC to inject the repository class into the IValidatableObject
when it's going to be created.
asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc
asp.net-mvc asp.net-mvc-5 ninject ninject.web.mvc
edited Nov 15 '18 at 16:03
amedina
asked Nov 14 '18 at 15:49
amedinaamedina
615411
615411
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in theNinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.
– amedina
Nov 15 '18 at 7:47
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete classSelectedFilteringCriteria
whereas you mentioned trying to inject it into an interfaceIValidatableObject
. What is wrong with injecting your repo interface into the concrete classSelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help
– GregH
Nov 15 '18 at 13:03
if you have multiple classes which inherit fromIValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something likeSelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected intoBaseCriteria
so that all classes which inherit from it have access to your repo
– GregH
Nov 15 '18 at 13:05
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:FiltersRepository
must be injected intoSelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates theSelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?
– amedina
Nov 15 '18 at 13:35
|
show 1 more comment
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in theNinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.
– amedina
Nov 15 '18 at 7:47
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete classSelectedFilteringCriteria
whereas you mentioned trying to inject it into an interfaceIValidatableObject
. What is wrong with injecting your repo interface into the concrete classSelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help
– GregH
Nov 15 '18 at 13:03
if you have multiple classes which inherit fromIValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something likeSelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected intoBaseCriteria
so that all classes which inherit from it have access to your repo
– GregH
Nov 15 '18 at 13:05
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:FiltersRepository
must be injected intoSelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates theSelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?
– amedina
Nov 15 '18 at 13:35
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in the
NinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.– amedina
Nov 15 '18 at 7:47
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in the
NinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.– amedina
Nov 15 '18 at 7:47
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete class
SelectedFilteringCriteria
whereas you mentioned trying to inject it into an interface IValidatableObject
. What is wrong with injecting your repo interface into the concrete class SelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help– GregH
Nov 15 '18 at 13:03
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete class
SelectedFilteringCriteria
whereas you mentioned trying to inject it into an interface IValidatableObject
. What is wrong with injecting your repo interface into the concrete class SelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help– GregH
Nov 15 '18 at 13:03
if you have multiple classes which inherit from
IValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something like SelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected into BaseCriteria
so that all classes which inherit from it have access to your repo– GregH
Nov 15 '18 at 13:05
if you have multiple classes which inherit from
IValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something like SelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected into BaseCriteria
so that all classes which inherit from it have access to your repo– GregH
Nov 15 '18 at 13:05
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:
FiltersRepository
must be injected into SelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates the SelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?– amedina
Nov 15 '18 at 13:35
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:
FiltersRepository
must be injected into SelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates the SelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?– amedina
Nov 15 '18 at 13:35
|
show 1 more comment
1 Answer
1
active
oldest
votes
Nope, it seems it's not possible because the MutableObjectModelBinder
class, which is the one MVC 5 uses to create the corresponding object (SelectedFilteringCriteria
in my case) from the action parameters, uses System.Activator
instead of resolving the dependencies SelectedFilteringCriteria
could have using the current DependencyResolver
.
A workaround for this could be to do this inside the constructor of SelectedFilteringCriteria
:
public SelectedFilteringCriteria()
{
_filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}
But that could drive to the Service Locator Antipattern. Your choice.
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',
autoActivateHeartbeat: false,
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%2f53304004%2fasp-net-mvc-5-inject-a-repository-into-an-ivalidatableobject%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
Nope, it seems it's not possible because the MutableObjectModelBinder
class, which is the one MVC 5 uses to create the corresponding object (SelectedFilteringCriteria
in my case) from the action parameters, uses System.Activator
instead of resolving the dependencies SelectedFilteringCriteria
could have using the current DependencyResolver
.
A workaround for this could be to do this inside the constructor of SelectedFilteringCriteria
:
public SelectedFilteringCriteria()
{
_filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}
But that could drive to the Service Locator Antipattern. Your choice.
add a comment |
Nope, it seems it's not possible because the MutableObjectModelBinder
class, which is the one MVC 5 uses to create the corresponding object (SelectedFilteringCriteria
in my case) from the action parameters, uses System.Activator
instead of resolving the dependencies SelectedFilteringCriteria
could have using the current DependencyResolver
.
A workaround for this could be to do this inside the constructor of SelectedFilteringCriteria
:
public SelectedFilteringCriteria()
{
_filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}
But that could drive to the Service Locator Antipattern. Your choice.
add a comment |
Nope, it seems it's not possible because the MutableObjectModelBinder
class, which is the one MVC 5 uses to create the corresponding object (SelectedFilteringCriteria
in my case) from the action parameters, uses System.Activator
instead of resolving the dependencies SelectedFilteringCriteria
could have using the current DependencyResolver
.
A workaround for this could be to do this inside the constructor of SelectedFilteringCriteria
:
public SelectedFilteringCriteria()
{
_filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}
But that could drive to the Service Locator Antipattern. Your choice.
Nope, it seems it's not possible because the MutableObjectModelBinder
class, which is the one MVC 5 uses to create the corresponding object (SelectedFilteringCriteria
in my case) from the action parameters, uses System.Activator
instead of resolving the dependencies SelectedFilteringCriteria
could have using the current DependencyResolver
.
A workaround for this could be to do this inside the constructor of SelectedFilteringCriteria
:
public SelectedFilteringCriteria()
{
_filtersRepository = DependencyResolver.Current.GetService<IFiltersRepository>();
}
But that could drive to the Service Locator Antipattern. Your choice.
answered Nov 15 '18 at 16:02
amedinaamedina
615411
615411
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.
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%2f53304004%2fasp-net-mvc-5-inject-a-repository-into-an-ivalidatableobject%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
so what is wrong with the code you posted? Are you looking for how to set up the ninject kernel/binding to make your code possible?
– GregH
Nov 14 '18 at 17:46
@GregH I even don't know if it's possible to make it work. Now, the repository class is configured in the
NinjectWebCommon
file and it's working properly when it comes to get injected into controllers, but I can't make it get injected into the class I posted, mostly because I don't instantiate that class, it's MVC which instantiates it with an incoming request. I would like to know how to get it injected into the class I posted.– amedina
Nov 15 '18 at 7:47
It sounds like you may be going about this a little bit the wrong way. I think you want to inject an interface for the repo into the concrete class
SelectedFilteringCriteria
whereas you mentioned trying to inject it into an interfaceIValidatableObject
. What is wrong with injecting your repo interface into the concrete classSelectedFilteringCriteria
? This is how I've seen DI done time and time again. I'm not sure why you'd need to inject anything into an interface itself. Maybe some more context would help– GregH
Nov 15 '18 at 13:03
if you have multiple classes which inherit from
IValidatableObject
and need your repo injected into each of them, then create a base class that your repo interface gets injected into and then have your other class(es) inherit from them. So the class signature would look something likeSelectedFilteringCriteria : BaseCriteria, IValidatableObject
where the repo is injected intoBaseCriteria
so that all classes which inherit from it have access to your repo– GregH
Nov 15 '18 at 13:05
@GregH I didn't say I want to inject a class inside an interface, that's absurd. Ok, in simpler terms:
FiltersRepository
must be injected intoSelectedFilteringCriteria
via constructor. How can I achieve that having into account that it's not me, but MVC what instantiates theSelectedFilteringCriteria
class. In summary: It's a configuration problem: How can I configure MVC and Ninject to achieve that?– amedina
Nov 15 '18 at 13:35