c# - 非泛型 Mvx.Resolve() 方法?

标签 c# windows-phone-8 xamarin mvvmcross

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

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

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

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

应用程序启动后,我想在每个已注册的服务上运行 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 提供者接口(interface)确实有一个方法:

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

关于c# - 非泛型 Mvx.Resolve() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16982615/

相关文章:

c# - 两阶段类型推理混淆

c# - MySqlContext如何将查询写入变量

windows-phone-8 - 在 Windows Phone 8 中以编程方式设置系统日期和时间

c# - Xamarin 禁用广播接收器

c# - 动态创建装饰器链

c# - 具有 OneWayToSource 绑定(bind)的 SelectedIndex 不会触发

c# - 删除媒体库中的图像

windows-phone-8 - 使用照片捕获设备捕获照片时方向错误

xamarin - Xamarin C#代码的IL大小?

c# - 在 Xamarin Forms 中显示模态对话框时,如何显示和设置 'BackButtonText' ?