其他分享
首页 > 其他分享> > 非泛型Mvx.Resolve()方法?

非泛型Mvx.Resolve()方法?

作者:互联网

在基于MvvmCross的应用程序中,
我正在Shared Core App类中向Mvx IOC容器注册一些单例服务类,如下所示:

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)之类的东西,但是该方法不存在.

我必须明确解决所有服务并在每个服务上调用方法,
还是有其他选择?
在此先感谢您的帮助!

解决方法:

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

 object Resolve(Type t)

但这并没有浮现到静态类中-从来没有人需要它

如果要访问它,则可以-只需以与静态Mvx帮助程序相同的方式访问ioc提供程序:

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

如果您认为这对其他人有用,请将其记录为功能请求,也可以通过Mvx进行公开.

另外,您也可以使用Linq自己调用MyMethod代码,例如:

  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-这将在您注册类型时为您提供回调(实际创建类型时可能不会).

标签:xamarin,windows-phone-8,mvvmcross,c
来源: https://codeday.me/bug/20191030/1970686.html