3

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

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),但这种方法不存在。

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

4

1 回答 1

4

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

于 2013-06-07T11:51:43.530 回答