Prism 提供了更多的注册方式,适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式,并附带相应的示例。1. 注册单例(Singleton)
注册单例类型服务,整个应用生命周期内只会创建一个实例,所有引用共享同一个实例。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<MyService>();
}
或者指定接口与实现:public interface IMyService { }
public class MyService : IMyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<IMyService, MyService>();
}
2. 注册瞬态(Transient)
每次请求都会创建新的实例,适用于不需要共享状态的服务。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>();
}
或者注册接口与实现:public interface IMyService { }
public class MyService : IMyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<IMyService, MyService>();
}
3. 注册实例(Instance)
注册一个已经存在的实例,容器将直接使用该实例而不是创建新实例。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{var instance = new MyService();containerRegistry.RegisterInstance<IMyService>(instance);
}
或者使用已存在的实例:public class MyService { }var instance = new MyService();
containerRegistry.RegisterInstance<IMyService>(instance);
4. 注册带参数的服务
如果服务构造函数需要额外的参数,可以使用 lambda 表达式来提供这些参数。public class MyService
{private readonly string _message;public MyService(string message){_message = message;}public string GetMessage() => _message;
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService("Hello, Prism!"));
}
5. 注册视图与视图模型(View & ViewModel)
Prism 提供了 RegisterForNavigation 方法来注册视图,并使用 Register 注册视图模型。注册视图:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterForNavigation<MyView>();
}
注册视图模型:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyViewModel>();
}
Prism 还支持通过 RegisterForNavigation 为视图配置参数:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterForNavigation<MyView, MyViewModel>("MyView");
}
6. 注册命令(DelegateCommand)
DelegateCommand 用于创建 UI 命令。可以使用 Register 来注册 DelegateCommand。public class MyViewModel
{public DelegateCommand MyCommand { get; private set; }public MyViewModel(){MyCommand = new DelegateCommand(ExecuteCommand);}private void ExecuteCommand(){// Command logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<DelegateCommand>();
}
7. 注册事件聚合器(Event Aggregator)
IEventAggregator 用于在组件之间发送和接收事件。你可以将其注册为单例。public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>();
}
8. 注册工厂(Factory)
使用工厂模式注册对象。通常通过工厂方法来动态创建对象。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService());
}
9. 注册泛型类型
可以注册泛型类型,这对于在应用中依赖泛型类的情况非常有用。public class MyService<T> { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService<int>>();
}
10. 注册类型别名
如果希望为一个类型提供别名,可以使用 Register 方法。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>("MyServiceAlias");
}
在解析时,可以使用别名来获取服务:var service = container.Resolve<MyService>("MyServiceAlias");
11. 注册已配置的服务
如果需要在容器中注册一个服务并且该服务需要其他配置(例如在构造时传入参数或者使用特定配置),可以使用 Register 配合 lambda 来进行注册。public class MyService
{private readonly string _config;public MyService(string config){_config = config;}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService("Configured"));
}
12. 注册包含生命周期管理的服务
你可以在注册时指定服务的生命周期。通常会使用瞬态(Transient)、单例(Singleton)、或作用域(Scoped)来管理对象的生命周期。public void RegisterTypes(IContainerRegistry containerRegistry)
{// 注册为瞬态服务containerRegistry.Register<MyService>();// 注册为单例服务containerRegistry.RegisterSingleton<IMyService, MyService>();// 注册为作用域服务(适用于 Web 或更复杂的场景)containerRegistry.RegisterScoped<IMyService, MyService>();
}
13. 注册装饰器(Decorator)
Prism 允许你使用装饰器模式来包装服务,从而增加额外的功能或行为。你可以将一个服务注册为另一个服务的装饰器。public interface IMyService
{void Execute();
}public class MyService : IMyService
{public void Execute(){// Service execution logic}
}public class MyServiceDecorator : IMyService
{private readonly IMyService _inner;public MyServiceDecorator(IMyService inner){_inner = inner;}public void Execute(){// Pre-processing logic_inner.Execute();// Post-processing logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<IMyService, MyService>();containerRegistry.RegisterDecorator<IMyService, MyServiceDecorator>();
}
14. 注册异步服务
使用 RegisterAsync 来注册异步加载的服务。这个特性在某些需要延迟加载的情况下非常有用。public class MyService
{public async Task InitializeAsync(){// Async initialization logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterAsync<MyService>(async c =>{var service = new MyService();await service.InitializeAsync();return service;});
}
总结
通过 Prism 的 IContainerRegistry,你可以灵活地注册不同生命周期、参数化、泛型、装饰器等各种类型的服务。上述是最常见的几种注册方式,适用于不同的应用场景。通过这些注册方式,能够实现灵活且高效的依赖注入,帮助你更好地构建模块化和可维护的 WPF 应用。