Contrôleur de Base du constructeur d'injection dans ASP.NET MVC avec l'Unité

J'ai un contrôleur de base dans mon MVC 5 projet qui met en œuvre conjointement à la fonctionnalité. Cette fonctionnalité nécessite quelques dépendances. Je suis à l'aide de l'Unité 3 à injecter ces implémentations dans mes contrôleurs, un modèle qui a bien fonctionné jusqu'à ce que j'ai changé mon contrôleurs d'hériter de ce contrôleur de base. Maintenant, je suis en cours d'exécution dans le problème suivant:

public class BaseController : Controller
{
    private readonly IService _service;

    public BaseController(IService service)
    {
        _service = service;
    }
}

public class ChildController : BaseController
{
    private readonly IDifferentService _differentService;

    public ChildController(IDifferentService differentService)
    {
        _differentService = differentService;
    }
}

C'est compréhensible de lancer une erreur de 'BaseController' does not contain a constructor that takes 0 arguments. L'unité n'est pas la résolution de la construction de la BaseController, donc il ne peut pas injecter les dépendances en elle. Je vois deux façons évidentes de la résolution de cette question:

1.) Appeler explicitement la BaseController ctor et ont chacun ChildController ctor injecter le BaseController dépendances

public class ChildController : BaseController
{
    private readonly IDifferentService _differentService;

    public ChildController(IDifferentService differentService,
                           IService baseService)
        : base(baseService)
    {
        _differentService = differentService;
    }
}

Je n'aime pas cette approche pour plusieurs raisons: premièrement, parce que le ChildControllers n'êtes pas faire usage de dépendances supplémentaires (de sorte qu'il provoque constructeur de la météorisation chez l'enfant, des contrôleurs pour aucune raison), et, plus important encore, si jamais j'ai changer la signature du constructeur du Contrôleur de Base, j'ai du modifier le constructeur de signatures de chaque enfant contrôleur.

2.) Mettre en œuvre les BaseController les dépendances via la propriété d'injection

public class BaseController : Controller
{
    [Dependency]
    public IService Service { get; set; }

    public BaseController() { }
}

J'aime cette approche mieux - je ne suis pas à l'aide de l'une des dépendances de la BaseController du code de constructeur - mais il fait de l'injection de dépendance de la stratégie du code incompatibles, ce qui n'est pas l'idéal non plus.

Il y a probablement une bien meilleure approche qui implique une sorte de BaseController dépendance de la fonction de résolution qui appelle à l'Unité de conteneur pour le tri ctor de la signature de la méthode, mais avant de me lancer dans l'écriture de quelque chose de trop impliqué, je me demandais si quelqu'un avait résolu ce problème avant? J'ai trouvé quelques solutions qui circulent sur le web, mais ils ont des solutions de contournement comme Localisateur de Service que je ne veux pas utiliser.

Merci!

InformationsquelleAutor NWard | 2014-02-20