Architettura dei parametri di Autofac

0

Ho iniziato con una tana di coniglio Autofac che penso di dover eliminare. Ho un sito .NET MVC in cui un utente può elencare i propri giocatori preferiti per sport (baseball, basket, ecc.). Ho un controller per i giocatori e sto iniettando IPlayerService . Tuttavia, il mio problema è che il servizio deve sapere con quale sport abbiamo a che fare. Attualmente sto usando i parametri con chiave con un enum di Sports che sto registrando in Autofac in questo modo:

foreach (var value in Enum.GetValues(typeof(Sports)))
{
    var sport = (Sports)value;

    builder.RegisterType<PlayerService>()
        .Keyed<IPlayerService>(sport)
        .WithParameter(new NamedParameter("sport", sport))
        .InstancePerLifetimeScope();
}

Anche lo sport deve essere spinto a IPlayerRepository , che ho registrato quasi esattamente come sopra con IPlayerService.

La mia ultima domanda è, come posso registrare PlayersController in modo da iniettare correttamente IPlayersService con lo sport corretto? Supponiamo che il mio percorso assomigli a www.example.com/players/baseball .

Questo progetto è principalmente per aiutarmi ad avere più esperienza con Autofac, quindi potrebbe essere ovvio che sono essenzialmente un principiante con esso.

    
posta Matt 21.10.2016 - 15:53
fonte

1 risposta

1

La tua root di composizione non avrà idea di che tipo di sport passare, poiché fa parte dell'inizializzazione complessiva e non viene eseguita come parte di qualsiasi richiesta dell'utente. Presumibilmente, tuttavia, il controller saprà quale sport, forse annusando la querystring, o utilizzando altri dati contestuali che vengono trasmessi come parte della logica di routing.

Se questo è il caso, allora ecco la soluzione:

  1. Non iniettare un IPlayerService . Invece, iniettare un IPlayerServiceFactory .
  2. Modifica il controller in modo che utilizzi la fabbrica per ottenere un IPlayerService del tipo appropriato, ad es.

    class MyController : Controller
    {
        private readonly IPlayerServiceFactory _playerServiceFactory;
    
        public MyController(IPlayerServiceFactory psf)
        {
            _playerServiceFactory = psf;
        }
    
        public ActionResult MyAction(string sportType)
        {
            IPlayerService playerService = _playerServiceFactory.GetService(sportType);
            //Do other stuff
            return View();
        }
    }
    
risposta data 27.02.2017 - 20:56
fonte

Leggi altre domande sui tag