升级Prism与Xamarin Forms后Unity类型注册问题咨询
解决Prism+Unity升级后的容器注册问题
嘿,升级Prism和Xamarin.Forms后碰到Unity注册报错的问题太常见了——毕竟Prism这波更新调整了Unity容器的集成方式,连命名空间都换了。我帮你梳理下怎么改代码:
先搞定依赖和命名空间
首先确认你装了最新版的Prism.Unity NuGet包,然后把App.xaml.cs里的旧命名空间换掉:
// 把原来的Prism.Unity换成这个 using Prism.Unity.Ioc; // 如果要直接用Unity的原生API,再加这个 using Unity;
修改RegisterTypes方法(核心变化)
原来的RegisterTypes方法签名和内部调用都变了!Prism现在用IContainerRegistry来做通用容器注册,不再直接暴露Unity的Container对象。给你两种可行的写法:
写法1:用Prism通用容器API(推荐)
这种写法不依赖Unity的具体实现,以后换其他容器(比如DryIoc)也不用改太多代码,对应不同生命周期的注册示例:
// 注意方法签名多了IContainerRegistry参数! protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 单例注册(对应你原来的ContainerControlledLifetimeManager,全局唯一实例) containerRegistry.RegisterSingleton<ISession, SQLiteSession>(); // 瞬时注册(每次请求都创建新实例,对应Unity的TransientLifetimeManager) containerRegistry.RegisterTransient<IMyDataService, MyDataService>(); // 作用域注册(每个导航作用域内唯一,比如每个页面实例对应一个) containerRegistry.RegisterScoped<IScopedService, ScopedService>(); }
写法2:直接用Unity原生容器(适合需要Unity特定配置的场景)
如果你必须用Unity的原生生命周期管理器或高级配置,可以通过IContainerRegistry拿到Unity容器实例:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 获取Unity原生容器 var unityContainer = containerRegistry.GetContainer(); // 和你原来的代码几乎一样,只是从containerRegistry拿容器 unityContainer.RegisterType<ISession, SQLiteSession>(new ContainerControlledLifetimeManager()); // 其他Unity原生注册示例 unityContainer.RegisterType<IMyService, MyService>(new TransientLifetimeManager()); }
单个类型注册的具体示例
就拿你提到的ISession注册来说:
- 用Prism通用API的单例注册(推荐):
containerRegistry.RegisterSingleton<ISession, SQLiteSession>();
- 用Unity原生API的方式(和你原来逻辑一致):
var unityContainer = containerRegistry.GetContainer(); unityContainer.RegisterType<ISession, SQLiteSession>(new ContainerControlledLifetimeManager());
关键注意点
- 方法签名必须改!原来的
protected override void RegisterTypes()要改成带IContainerRegistry参数的版本,这是很多人忽略的第一个错误。 - 旧的
Prism.Unity命名空间下的类型大多已经过时或被移除,一定要换成Prism.Unity.Ioc。
内容的提问来源于stack exchange,提问作者BTI-Doug
相关产品推荐
相关产品推荐

