非泛型Mvx.Resolve()方法

本文关键字:方法 Resolve 泛型 Mvx | 更新日期: 2023-09-27 18:17:33

在我基于MvvmCross的应用程序中,
我在Shared Core App类中为Mvx IOC container注册了几个单例服务类,如下所示:

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

所有注册的服务都继承自一个基类:

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

App启动后,我想在每个注册的服务上运行MyMethod()

我试图执行以下操作:

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

但是调用Mvx.IocConstruct创建了另一个对象,并且我想在IoC注册期间创建的单例实例上执行操作。

我认为我需要的是像Mvx.Resolve(Type t)这样的东西,但是这种方法不存在。

我必须明确解析所有服务并在每个服务上调用该方法吗?
或者还有其他选择吗?
提前感谢您的帮助!

非泛型Mvx.Resolve()方法

底层的IoC提供程序接口确实有一个方法:

 object Resolve(Type t)

但是它并没有出现在静态类中——在此之前没有人需要它

如果你想访问它,那么你可以-只需以与静态Mvx helper相同的方式访问ioc提供程序:

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

如果你认为这对其他人有用,请将此记录为通过Mvx公开的功能请求。


或者,您可以使用Linq…比如:

  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();
  }

还有一个方法可能对你有用。

你可以在一个类型被注册的时候注册回调——参见Mvx.CallbackWhenRegistered——这将在一个类型被注册的时候给你一个回调(可能不是在这个类型被实际创建的时候)。