当前位置: 首页 > article >正文

WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项

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 应用。


http://www.kler.cn/a/391266.html

相关文章:

  • DNS面临的4大类共计11小类安全风险及防御措施
  • POI实现根据PPTX模板渲染PPT
  • 【pytorch】常用强化学习算法实现(持续更新)
  • 【深度解析】CSS工程化全攻略(1)
  • linux 下查看程序启动的目录
  • aws(学习笔记第十二课) 使用AWS的RDS-MySQL
  • 最大子数组和
  • vector和docker的区别?
  • RK3568平台开发系列讲解(GPIO篇)基于整数的GPIO接口
  • https网站 请求http图片报错:net::ERR_SSL_PROTOCOL_ERROR
  • 低空载功耗,高能源利用率 BDA5-20W BOSHIDA DCDC
  • 区块链赋能Web3:数据透明与隐私保护的新纪元
  • 如何解决亚马逊商家IP问题:静态住宅IP的优势与选择指南
  • C#界面设计
  • 深度学习中gpu的写法
  • 另一个角度的“业务向前,数据库向后”
  • Rust 整数
  • vue读取本地excel文件并渲染到列表页面
  • 低代码开发
  • Tofu AI视频处理模块视频输入配置方法
  • LeetCode 热题100 之 多维动态规划
  • 在 Flutter 应用中调用后端接口的方法
  • Linux高阶——1109—线程函数线程属性线程分类
  • 【缓存策略】你知道 Write Around(缓存绕过写)这个缓存策略吗?
  • SQL Servers审核提高数据库安全性
  • 机器学习day1-数据集