2017-07-24 2 views
2

Je veux injecter Modules et Data propriétés d'un fichier autofac.json dans mon ApiController avec le nom DataControllerAutofac injectent des propriétés sur ApiController en combinaison avec RegisterApiControllers

Je lis cette page: http://docs.autofac.org/en/latest/configuration/xml.html mais mes propriétés continuent à être NULL, je doit faire quelque chose de mal. Qui peut m'aider?

Mon Controller a déjà un constructeur dans lequel une instance de ILog est injectée, donc ces propriétés sont en sus.

Voici la configuration Autofac J'ai maintenant:

var builder = new ContainerBuilder(); 
builder.RegisterApiControllers(typeof(Startup).Assembly); // to register all ApiControllers at once 

// Use the Microsoft Configuration Extensions together with Autofac to create an Autofac Module 
var autofacConfig = new ConfigurationBuilder(); 
autofacConfig.AddJsonFile("autofac.json"); 
var autofacModule = new ConfigurationModule(autofacConfig.Build()); 
builder.RegisterModule(autofacModule); 

var container = builder.Build(); 

var httpConfigurationConfig = new HttpConfiguration { DependencyResolver = new AutofacWebApiDependencyResolver(container) }; 

app.UseAutofacMiddleware(container); 
app.UseAutofacWebApi(httpConfigurationConfig); 
app.UseWebApi(httpConfigurationConfig); 

Ceci est mon autofac.json:

{ 
    "components": [ 
    { 
     "type": "Web.Controllers.DataController, Web", 
     "injectProperties": true, 
     "properties": { 
     "Modules": { 
      "Module1": "http://localhost:12345/", 
      "Module2": "http://localhost:12346/" 
     }, 
     "Data": { 
      "Item1": "Declarations", 
      "Item2": "Payments" 
     } 
     } 
    } 
    ] 
} 

Mon Controller ressemble à ceci:

namespace Web.Controllers 
{ 
    public class DataController : ApiController 
    { 
     private readonly ILog _log; 
     public Dictionary<string, string> Modules { get; set; } // << I want these to be injected! 
     public Dictionary<string, string> Data { get; set; } // << 

     public DataController(ILog log) // gets injected 
     { 
      _log = log; 
     } 
    } 
} 
+0

Les 'Modules' et 'Data' ne devraient-ils pas être des propriétés et non des champs? – Jeroen

+0

Pendant un moment, je me sentais stupide :-) mais malheureusement, même avec des propriétés, le problème persiste. – 321X

+0

La modification de 'Dictionary' en' IDictionary' fait-elle une différence? – tdragon

Répondre

0

Je ne vois pas où vous branchez le conteneur dans le pipeline WebApi?

config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

De plus, lorsque vous voulez injection de propriété, vous devez utiliser la méthode PropertiesAutowired()

builder.RegisterApiControllers(typeof(Startup).Assembly).PropertiesAutowired(); 
+0

Le résolveur de dépendances est branché, j'ai mis à jour le code. Le 'PropertiesAutowired' ne fait malheureusement pas la différence ... – 321X

0

Le code que vous fournissez semble être bien - je l'ai copié et il fonctionne très bien.

Vous devez vous rappeler que les propriétés sont injectées après le composant est créé, donc en vous constructeur son contrôleur ces propriétés sont null, mais quand vous frappez la méthode du contrôleur, ils sont remplis de données appropriées que vous avez fournies dans votre fichier de configuration JSON .

+0

Ai-je besoin d'en faire une ressource intégrée ...? – 321X

+0

Non, je l'ai comme un "contenu", sans le faire glisser dans le répertoire de sortie. Je l'ai directement dans le répertoire du projet, pas dans l'un des sous-répertoires – tdragon