You need to enable JavaScript to run this app. Xamarin MVVMCross如何为多接口实现类注册共享单例并解析
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin MVVMCross如何为多接口实现类注册共享单例并解析

问题解答

  1. 是否可以将同一个Travel实例同时注册到两个接口?
    完全可以,MVVMCross的IoC容器支持将同一个实例绑定到多个服务类型(接口),但原生没有你提到的Mvx.IoCProvider.RegisterSingleton<IVehicle, IDestination>(new Travel())双泛型注册的重载,你可以通过先实例化对象再分别注册的方式实现:
// 只实例化一次Travel对象
var sharedTravelInstance = new Travel();
// 将同一个实例分别注册到两个接口
Mvx.IoCProvider.RegisterSingleton<IVehicle>(sharedTravelInstance);
Mvx.IoCProvider.RegisterSingleton<IDestination>(sharedTravelInstance);

这样无论你通过Resolve<IVehicle>()还是Resolve<IDestination>()拿到的都是同一个Travel实例。

  1. 有没有直接解析出同时实现两个接口实例的方法?
    原生MVVMCross没有你示例的Resolve<IVehicle, IDestination>()双泛型解析语法,你可以通过以下两种方式实现需求:
  • 方式一:强转解析结果
    解析任意一个接口后强转为Travel实现类,即可调用两个接口的所有方法:
    var travel = Mvx.IoCProvider.Resolve<IVehicle>() as Travel;
    // 直接调用两个接口的方法
    travel.SelectVehicle(...);
    travel.DistanceToDestination(...);
    
  • 方式二:定义组合接口(更符合依赖注入规范)
    额外定义一个继承两个业务接口的组合接口,让Travel实现该接口,后续直接解析组合接口即可:
    // 定义组合接口
    public interface ITravel : IVehicle, IDestination { }
    // 让Travel类实现该接口
    public class Travel : ITravel { }
    
    // 注册时额外绑定组合接口
    var sharedTravelInstance = new Travel();
    Mvx.IoCProvider.RegisterSingleton<IVehicle>(sharedTravelInstance);
    Mvx.IoCProvider.RegisterSingleton<IDestination>(sharedTravelInstance);
    Mvx.IoCProvider.RegisterSingleton<ITravel>(sharedTravelInstance);
    
    // 解析时直接拿组合接口实例,无需强转
    var travel = Mvx.IoCProvider.Resolve<ITravel>();
    travel.SelectVehicle(...);
    travel.DistanceToDestination(...);
    

如果你需要频繁做多接口绑定,可以自己封装扩展方法,通过反射批量注册实例实现的所有接口,简化注册流程。


内容的提问来源于stack exchange,提问作者Shailesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 08:36:00