3

J'utilise ASP.NET MVC 2 pour implémenter un service Web et moi avons une coutume JsonResult classe:Comment utiliser Ninject pour injecter une propriété statique?

public abstract class JsonResult : ActionResult 
{ 
    public static ISerializer Serializer { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var json = Serializer.Serialize(this); 
     context.HttpContext.Response.Write(json); 
    } 
} 

JsonResult est la classe de base abstraite pour tous les résultats qui devraient être sérialisés en données JSON. Il utilise un ISerializer pour effectuer la sérialisation. J'utilise Ninject comme conteneur IoC. Cependant, je ne suis pas vraiment sûr de la façon dont je devrais injecter la dépendance ISerializer. Je faisais à l'origine cela:

var kernel = new StandardKernel().Bind<ISerializer>().To<JsonNetSerializer>(); 
JsonResult.Serializer = kernel.Get<ISerializer>(); 

Mais quelque chose à ce sujet ne semble pas tout à fait correct. Alors, comment pourrais-je injecter la propriété Serializer correctement? Je veux l'injecter seulement une fois quand l'application démarre.

Répondre

4

Désolé, MVC n'est pas ma ligue, mais est-il une raison pour laquelle vous ne pouvez pas supprimer le modificateur static, durée de vie ensemble de JsonNetSerializer être singleton, et ont injecté dans ce constructeur de JsonResult? Notez en particulier ceci rend la dépendance sur ISerializer explicite (une bonne chose) et évite static (une bonne chose).

+0

Cela signifie-t-il que, pour conserver la propriété 'Serializer' en tant que singleton, je dois toujours utiliser un conteneur IoC pour instancier une instance de' JsonResult'? –

+1

@Daniel T .: De préférence, vous devriez utiliser une usine. Donc, si vous avez une classe qui instancie 'ConcreteJsonResult', cela devrait prendre' JsonResultFactory'. Bien sûr, vous pouvez juste faire 'JsonResultFactory.Create ' en suivant les lignes de 'return kernel.Get ();'. – jason

+0

Merci Jason. J'ai toujours évité de créer des usines parce que mes applications sont si simples que l'utilisation d'une usine semble compliquer inutilement les choses, mais je pense que je vais essayer. –