Unité Enregistrez deux interfaces en un seul singleton

comment enregistrer deux interfaces différentes dans Unity avec la même instance … Actuellement, j’utilise

_container.RegisterType(new ContainerControlledLifetimeManager()); _container.RegisterInstance(_container.Resolve()); _container.RegisterInstance(_container.Resolve()); 

qui fonctionne, mais n’a pas l’air bien ..

Donc, je pense que vous avez l’idée. EventService implémente deux interfaces, je veux une référence au même object si je résous les interfaces.

Chris

    modifier

    Après quelques commentaires dans les commentaires, j’ai décidé que la réponse de Sven était une réponse bien supérieure. Merci à Chris Tavares d’avoir souligné les mérites techniques.


    C’est à peu près la seule façon de le faire.

    Vous pouvez le modifier légèrement (je déteste RegisterType avec le même type pour chaque paramètre générique):

     EventService es = _container.Resolve(); _container.RegisterInstance(es); _container.RegisterInstance(es); 

    Si un ou plusieurs de vos enfants IoC demandent le type EventService concret (espérons que ce ne soit pas le cas), vous appendez un RegisterInstance supplémentaire de type RegisterInstance . J’espère que vous n’en avez pas besoin et que tous les objects dépendants demandent un IEventService plutôt qu’un EventService .

    J’espère que ça aide, Anderson

    [Modifier]

    La solution pour y parvenir via la configuration XML peut être trouvée ici . Sur la base de cette réponse, je proposerais une approche simplifiée du code uniquement, comme suit:

     _container.RegisterType(new ContainerControlledLifetimeManager()); _container.RegisterType(new ContainerControlledLifetimeManager()); bool singleton = ReferenceEquals(_container.Resolve(), _container.Resolve()); 

    De cette manière, la classe EventService elle-même n’est pas publiée par le conteneur. Comme la classe doit être considérée comme un détail d’implémentation, c’est l’approche préférable.

    [Réponse originale]

    Un peu en retard une réponse, mais devrait faire l’affaire:

     _container.RegisterType(new ContainerControlledLifetimeManager()); _container.RegisterType(); _container.RegisterType(); bool singleton = ReferenceEquals(_container.Resolve(), _container.Resolve()); 

    L’approche de l’adaptateur semblait encombrante pour une chose si simple, alors j’ai regardé un peu plus loin. Pour contourner le problème des instances nommées, vous devez enregistrer le type et enregistrer les fabriques pour les interfaces.

      InjectionFactory factory = new InjectionFactory(x => x.Resolve()); this.Container.RegisterType(new ContainerControlledLifetimeManager()); this.Container.RegisterType("SimulationContentProvider", factory); this.Container.RegisterType(factory); 

    De cette façon, vous n’avez pas besoin de créer une instance de la classe concrète (lors de l’inscription), ce qui n’était pas possible dans mon cas en raison de dépendances manquantes.

    Une solution qui peut également fonctionner pour les instances nommées consiste à utiliser le modèle d’adaptateur pour créer des adaptateurs jetables sur l’interface qui entoure les instances singleton. Les instances résolues seront toujours dirigées vers l’instance singleton, événement si elles sont résolues à l’aide de ResolveAll. Cela aide lorsque vous avez un tas de services qui implémentent une interface générique comme IStartable ou quelque chose.

     public class EventServiceAdapter : IEventService where T : IEventService { private readonly T _adapted; EventServiceAdapter(T adapted) { _adapted = adapted; } public ssortingng SomeMethod() { return _adapted.SomeMethod(); } } 

    Ensuite, enregistrez l’adaptateur d’interface autour de votre type de singleton enregistré.

     _container .RegisterType(new ContainerControlledLifetimeManager()) .RegisterType>("namedEventService"); 

    Vous pouvez ensuite masquer un singleton derrière un nombre quelconque d’interfaces et utiliser Resolve et ResolveAll.