Sto tentando di eseguire una DI con il costruttore semplice con Injector semplice e sembra che non sia in grado di risolvere le dipendenze per i controller API Web.Iniettore semplice non in grado di iniettare dipendenze nei controller API Web
- Ho un controller API in una cartella "API", che si trova all'esterno della cartella "Controllers".
- Ho anche provato a collocarlo nella cartella "Controllers", ma lo non sembra fare molta differenza. La traccia di stack ricevuta da è simile a quella presentata in this question.
- Sto utilizzando una nuova installazione del pacchetto NuGet di "Simple Injector MVC Integration Quick Start" (v. 2.1.0).
- Ho la base
SimpleInjectorWebApiDependencyResolver
dalla documentazione, che è anche la stessa trovata here. - Sto utilizzando Entity Framework e ho esaminato lo discussion thread sulle modifiche per caricare correttamente il contesto.
Questo non sembra essere un problema, ma ho ancora visualizzato il seguente errore:
Type 'MyProject.API.ArticleController' does not have a default constructor
System.ArgumentException at
System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
Sarebbe apprezzato se qualcuno potesse offrirmi qualche suggerimento, se qualcosa dovesse essere modificato da il suo stato attuale/ordine di chiamata.
ArticleController (struttura di base):
public class ArticleController : ApiController
{
private readonly IArticleRepository articleRepository;
private readonly IUserRepository userRepository;
private readonly IReleaseRepository releaseRepository;
public ArticleController(IArticleRepository articleRepository, IUserRepository userRepository, IReleaseRepository releaseRepository)
{
this.articleRepository = articleRepository;
this.userRepository = userRepository;
this.releaseRepository = releaseRepository;
}
// GET api/Article
public IEnumerable<Article> GetArticles(){ // code }
// GET api/Article/5
public Article GetArticle(int id){ // code }
// PUT api/Article/5
public HttpResponseMessage PutArticle(int id, Article article){ // code }
// POST api/Article
public HttpResponseMessage PostArticle(ArticleModel article){ // code }
// DELETE api/Article/5
public HttpResponseMessage DeleteArticle(int id){ // code }
}
SimpleInjectorInitializer:
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IArticleRepository, ArticleRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<IReleaseRepository, ReleaseRepository>();
}
}
Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
private void ConfigureApi()
{
// Create the container as usual.
var container = new Container();
// Verify the container configuration
// container.Verify();
// Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ConfigureApi();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Sei sicuro che il metodo 'ConfigureApi' è in realtà in esecuzione? Hai impostato un punto di rottura in esso? – Steven
Qualsiasi motivo per cui si crea un'istanza 'Container' separata per la configurazione dell'API Web? – Steven
Sì, sono sicuro che è in esecuzione. Ho un punto di interruzione impostato sulla linea che imposta DependencyResolver su GlobalConfiguration. Se intendi all'interno di Global.asax.cs, seguivo questa guida (http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver), per vedere se avrebbe risolto il mio problema. Tuttavia, non sembrava. – user1417835