3 votes

Méthode non générique Mvx.Resolve() ?

Dans mon MvvmCross sur la base d'une application,
J'enregistre quelques classes de service singleton auprès de Mvx IOC container à l'intérieur de mon Shared Core App comme suit :

CreatableTypes()
    .EndingWith("Service")
    .AsInterfaces()
    .RegisterAsSingleton();

Tous les services enregistrés héritent d'une classe de base :

public abstract class BaseService
{
    public abstract void MyMethod();
}

Après le démarrage de l'App, j'aimerais exécuter MyMethod() sur chacun des services enregistrés.

J'ai essayé de faire ce qui suit :

var serviceTypes = ReflectionUtils.GetTypesFromBase<BaseService>();
foreach (Type serviceType in serviceTypes)
{
    BaseService service = (BaseService)Mvx.IocConstruct(serviceType);
    service.MyMethod();
}

Mais en appelant Mvx.IocConstruct crée un autre objet, et j'aimerais effectuer l'action sur l'instance singleton qui a été créée lors de l'enregistrement IoC.

Je pense que ce dont j'ai besoin est quelque chose comme Mvx.Resolve(Type t) mais cette méthode n'existe pas.

Dois-je résoudre spécifiquement tous les services et appeler la méthode sur chacun d'entre eux ?
ou existe-t-il une alternative ?
Merci d'avance pour votre aide !

4voto

Stuart Points 45896

L'interface du fournisseur IoC sous-jacent dispose d'une méthode :

 object Resolve(Type t)

mais il n'est pas intégré à la classe statique - personne n'en a jamais eu besoin auparavant

Si vous souhaitez y accéder, c'est possible - il suffit d'accéder au fournisseur ioc de la même manière qu'au fournisseur statique. Mvx le fait :

        var ioc = MvxSingleton<IMvxIoCProvider>.Instance;
        var yourObject = ioc.Resolve(type);

Si vous pensez que cela pourrait être utile à d'autres personnes, veuillez enregistrer cette demande de fonctionnalité pour l'exposition par l'intermédiaire de Mvx aussi.


Vous pouvez également appeler le code MyMethod vous-même en utilisant Linq... quelque chose comme :

  var query = CreatableTypes()
      .EndingWith("Service")
      .AsInterfaces();

  var serviceList = new List<BaseService>();

  foreach (var item in query)
  {
       var service = (BaseService)Mvx.IocConstruct(item.ImplementationType);
       serviceList.Add(service);
       foreach (var interfaceType in item.ServiceTypes)
       {
           Mvx.RegisterSingleton(interfaceType, service);
       }
  }

  foreach (var service in serviceList)
  {
       service.MyMethod();
  }

Il existe une autre méthode qui peut vous être utile.

Vous pouvez enregistrer des rappels lorsqu'un type est enregistré - voir Mvx.CallbackWhenRegistered - cela vous donnera un rappel lorsqu'un type est enregistré (ce qui peut ne pas être le cas lorsque le type est réellement créé).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X