使用Prism Autofac注册服务失败,求正确实现方案
Hey there! Let's figure out what's tripping you up with Prism and Autofac—since newer Prism versions (8+) completely revamped how container integration works, those old guides you found are definitely out of date. Here's the breakdown of common mistakes and fixes:
1. Make Sure You're Using the Right NuGet Packages
First, double-check you've installed the correct Prism-Autofac package for your platform:
- For WPF:
Prism.Autofac.Wpf - For Xamarin.Forms:
Prism.Autofac.Forms - For general .NET apps:
Prism.Autofac
Avoid mixing old and new packages—stick to the latest stable versions to ensure compatibility.
2. Stop Manually Creating a ContainerBuilder
This is the most common mistake! In newer Prism, you don't need to instantiate a ContainerBuilder from scratch. Prism manages the container lifecycle for you, and you should use its abstract IContainerRegistry interface for registrations.
If you try to build your own container outside Prism's context, it won't be hooked into Prism's dependency injection system—so your services won't be available for injection, and you'll get those confusing errors.
3. Use Prism's Abstraction (or Access Autofac's Native Features When Needed)
Basic Registration (Prism's Cross-Container Syntax)
For most cases, use Prism's built-in registration methods—they work across all supported containers, including Autofac:
public void RegisterTypes(IContainerRegistry containerRegistry) { // Register a transient service containerRegistry.Register<IMyService, MyService>(); // Register a singleton containerRegistry.RegisterSingleton<IMySingletonService, MySingletonService>(); }
Autofac-Specific Configurations (Like .As())
If you need Autofac's unique features (like .As(), .InstancePerLifetimeScope(), etc.), you can get the underlying Autofac ContainerBuilder using Prism's extension method:
public void RegisterTypes(IContainerRegistry containerRegistry) { // Get Autofac's native builder var autofacBuilder = containerRegistry.GetContainerBuilder(); // Now you can use all Autofac's syntax, including .As() autofacBuilder.RegisterType<SpecializedService>() .As<ISpecializedService>() .InstancePerLifetimeScope(); }
The reason you couldn't use .As() before is that Prism's IContainerRegistry methods return a cross-container configuration object, not Autofac's registration builder. You have to explicitly grab the Autofac builder to use its native methods.
4. Verify Your Application Base Class
Ensure your app's base class is using the Prism-Autofac variant:
- WPF: Instead of
PrismApplication, useAutofacPrismApplication - Xamarin.Forms: Instead of
PrismApplication, useAutofacPrismApplication
This ensures Prism initializes the Autofac container correctly from the start.
Quick Recap
- Ditch manual
ContainerBuilderinstances—useIContainerRegistryinstead - Use Prism's abstract methods for basic registrations, switch to Autofac's builder only for container-specific logic
- Double-check your NuGet packages and app base class match the latest Prism-Autofac setup
内容的提问来源于stack exchange,提问作者Bjorn Fontaine




