Xamarin MVVMCross如何为多接口实现类注册共享单例并解析
问题解答
- 是否可以将同一个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实例。
- 有没有直接解析出同时实现两个接口实例的方法?
原生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
相关产品推荐
相关产品推荐

