Le château de Windsor - multiples de la mise en œuvre d'une interface
Lors de l'inscription de composants dans le Château de Windsor, comment pouvons-nous lier spécifiques de mise en œuvre d'une interface d'un composant qui a une dépendance sur cette interface. Je sais à l'avance la mise en œuvre doit être utilisé par le composant.
Par exemple, j'ai créé un exemple de l'application de la console basée sur le code de plusieurs blogs et des tutoriels.
Voici le code.
public interface IReport
{
void LogReport();
}
public interface ILogger
{
string Log();
}
public class FileLogger : ILogger
{
public string Log()
{
return "Logged data to a file";
}
}
public class DatabaseLogger : ILogger
{
public string Log()
{
return "Logged data to a database";
}
}
public class McAfeeService : IReport
{
private readonly ILogger _logger;
public McAfeeService(ILogger logger)
{
this._logger = logger;
}
public void LogReport()
{
string getLogResult = this._logger.Log();
Console.WriteLine("McAfee Scan has " + getLogResult);
}
}
public class NortonService : IReport
{
private readonly ILogger _logger;
public NortonService(ILogger logger)
{
this._logger = logger;
}
public void LogReport()
{
string getLogResult = this._logger.Log();
Console.WriteLine("Norton Scan has " + getLogResult);
}
}
class Program
{
private static IWindsorContainer container;
static void Main(string[] args)
{
//Register components
container = new WindsorContainer();
container.Register(Component.For<IReport>().ImplementedBy<NortonService>());
container.Register(Component.For<ILogger>().ImplementedBy<FileLogger>());
IReport service = container.Resolve<IReport>();
service.LogReport();
Console.ReadLine();
}
}
Je voudrais NortonService de toujours utiliser un Filelogger et McAfeeService utiliser une Base de données de journalisation.
Dans le programme ci-dessus, je suis incapable de lier NortonService à FileLogger.
Comment faire?
Vous devez vous connecter pour publier un commentaire.
Les réponses ci-dessus me conduire aux commandes de dépendances et de la fonctionnalité de service remplacer
Voici le code d'enregistrement:
De sortie:
J'ai eu un problème de ce genre, deux de la mise en œuvre d'une interface et de deux de la mise en œuvre d'une autre interface. J'ai voulu forcer l'utilisation de particulier implémentations de ces interfaces.
Ma structure de classe était comme ça -
J'ai regardé à la convention d'affectation de noms, mais n'ai pas vraiment aimé. Au lieu de cela j'ai utilisé le suivant -
Plein d'infos à propos de cette approche est ici. Dans le code source fourni avec ce post, je montre deux autres façons d'atteindre le même résultat.
Ma réponse peut-être pas le meilleur, vous pouvez utiliser la méthode de nommage pour résoudre multi de mise en œuvre:
Dans votre appel de fonctions, vous devez résoudre par son nom :-
Mine méthode peut-être pas le meilleur que les gens n'aiment pas localisateur de service pour obtenir les composants, vous pouvez l'utiliser comme solution temporaire.
Si vous voulez le faire au moment de l'exécution, Ce qui peut être obtenue par le biais de IHandlerSelector. Écrire une classe qui implémente IHandlerSelector. Il fournit une méthode SelectHandler qui vous permettra de définir l'état de la liaison conditionnelle à l'exécution. Un Gestionnaire dans ce cas est une composante à Windsor, qui participe à l'exemple de la construction. Reportez-vous ici pour plus de détails.