J'ai un service utilisé par quelques contrôleurs dans mon projet WebAPI. Le service doit générer des URL, donc idéalement il obtiendrait un UrlHelper
via un paramètre constructeur. J'utilise Autofac comme conteneur IoC. Comment puis-je enregistrer UrlHelper
dans le conteneur? Il a besoin d'un HttpRequestMessage
et je n'arrive pas à comprendre comment obtenir le message "courant".Injecter WebAPI UrlHelper en service avec Autofac
Répondre
Utilisez la méthode RegisterHttpRequestMessage
pour enregistrer la demande actuelle et vous pouvez également enregistrer l'assistant d'URL comme ceci:
public static IContainer SetupContainer(HttpConfiguration config)
{
var containerBuilder = new ContainerBuilder();
// Register your Web API.
containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
containerBuilder.RegisterHttpRequestMessage(config);
containerBuilder.Register(x => new UrlHelper(x.Resolve<HttpRequestMessage>()));
containerBuilder.RegisterWebApiFilterProvider(config);
containerBuilder.RegisterWebApiModelBinderProvider();
// Register your other types...
var container = containerBuilder.Build();
// Set the dependency resolver to be Autofac.
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
return container;
}
Autowiring les propriétés des contrôleurs api ne fonctionne pas avec RegisterHttpRequestMessage. c'est-à-dire RegisterApiControllers (Assembly.GetExecutingAssembly()). PropertiesAutowired(). Si vous utilisez ce code, vous perdez l'option d'autofonction des sites. – Mick
mieux que je peux penser est de rendre votre service mise en œuvre IAutofacActionFilter
comme si
public class MyService : IAutofacActionFilter
{
private UrlHelper _urlHelper;
public void DoSomething()
{
var link = Url.Link("SomeRoute", new {});
}
private UrlHelper Url
{
get
{
if(_urlHelper == null)
throw new InvalidOperationException();
return _urlHelper;
}
}
public void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
}
public void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
this._urlHelper = actionContext.Request.GetUrlHelper();
}
}
puis utiliser quelque chose comme la config Autofac suivante
builder.RegisterType<MyService>()
.AsWebApiActionFilterFor<SomeController>()
.AsSelf()
.InstancePerApiRequest();
Basé sur le commentaire de Darrel Miller, j'ai créé ce qui suit :
Une classe de conteneur simple pour contenir une référence au "courant" HttpRequestMessage
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
Un gestionnaire de messages qui stockera la demande actuelle
public class CurrentRequestHandler : DelegatingHandler
{
protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var scope = request.GetDependencyScope();
var currentRequest = (CurrentRequest)scope.GetService(typeof(CurrentRequest));
currentRequest.Value = request;
return await base.SendAsync(request, cancellationToken);
}
}
En Global.asax, lors de la configuration WebAPI, ajoutez le gestionnaire de messages.
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
Configurez ensuite le conteneur Autofac pour le laisser construire UrlHelper
, obtenir la demande actuelle de l'objet CurrentRequest
.
var builder = new ContainerBuilder();
builder.RegisterType<CurrentRequest>().InstancePerApiRequest();
builder.Register(c => new UrlHelper(c.Resolve<CurrentRequest>().Value));
builder.RegisterType<MyService>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
...
container = builder.Build();
UrlHelper
peut alors être injecté dans le MyService
comme toute autre dépendance.
Merci à Darrel de m'avoir orienté dans la bonne direction.
Je viens d'ajouter le support de l'injection de dépendance HttpRequestMessage à Autofac.WebApi et il sera inclus dans la prochaine version. https://code.google.com/p/autofac/source/detail?r=60d369499963b89224c1f682cfbf8592eae95342 –
Je ne pouvais pas travailler RegisterHttpRequestMessage mais ce code fait le travail – Mick
- 1. Autofac - Injecter ModelState en service
- 2. service WCF reposful injection WebOperationContext avec Autofac
- 3. Comment injecter UrlHelper dans MVC en utilisant Castle Windsor
- 4. Owin hébergé webapi 2.2. Contrôleur de test avec service simulé
- 5. module autofac résoudre config WebApi N Layer
- 6. Service WebApi REST sur IIS avec Autofac, erreur lors du premier appel
- 7. Hangfire dans WebApi avec Autofac: Travail non exécuté
- 8. Utiliser Autofac avec webapi et mvc5.1 ne fonctionne pas pour webapi
- 9. comment injecter une propriété de filtre globale avec autofac mvc3?
- 10. Injecter un objet dans un WCF personnalisé UserNamePassValidator - Autofac
- 11. Injecter des dépôts en service?
- 12. Ajax avec symfony UrlHelper
- 13. Injection d'une instance d'un service avec Autofac
- 14. Injection d'un service dans une classe de base avec Autofac
- 15. Autofac null service résolution exception
- 16. Accès MainViewModel de la page XAML lors de l'utilisation Autofac et injecter le service (s)
- 17. WebAPI: Accès conteneur enfant en tant que service de localisation
- 18. WCF Data Service vs WebAPI
- 19. AutoFac avec ASP.Identity
- 20. Injecter le service avec Dagger et Robolectric
- 21. Gestion Scopes à vie avec Autofac
- 22. Éviter le localisateur de service avec AutoFac 2
- 23. Injecter service de dans angulaire
- 24. Dependecy ne se résoudre à WebAPI (y compris OWIN) avec Autofac
- 25. Service Autofac non enregistré (Microsoft Bot Framework)
- 26. Ember CLI - Injecter un service
- 27. erreur UrlHelper et mono
- 28. Autofac au service commun Locator (TypedParameter numéro)
- 29. Azure WebApi vs Azure Mobile Service vs
- 30. Injection d'une classe enregistrée avec Autofac
Jetez un oeil à ce que nous avons travaillé sur le WebAPIBook, il a une solution possible à ce problème ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
Ah, oui, très bien. Je pensais à créer un gestionnaire de messages pour résoudre ce problème :) Je vais essayer. Merci. –