代码改变世界

Caliburn笔记-依赖注入容器(wpf框架)

  Clingingboy  阅读(1378)  评论(0编辑  收藏  举报

参考与此http://caliburn.codeplex.com/wikipage?title=Auto-Registering%20Components&referringTitle=Documentation

    此为基础,看了没用,不看不行…了解下注册流程.


注册组件,差不多离不开这几种模式

  1. 手动注册
  2. 元数据标签注册
  3. 外部dll加载注册

1.内置服务则用手动注册.

2.挂元数据标签,如下

[PerRequest(typeof(IHomePresenter))]
public class HomePresenter : Presenter, IHomePresenter
{
}


以前不是推荐此种做法的,标签会产生框架耦合,但框架用都用了,内置demo使用此方法最多,之前用的是手动注册,框架会去dll中寻找挂此标签的对象然后自动注册.

3.外部dll加载

重写CaliburnApplication的SelectAssemblies方法

protected override System.Reflection.Assembly[] SelectAssemblies()
{
    return new[] { Assembly.GetEntryAssembly(),typeof(Caliburn.WPF.ApplicationFramework.Bind).Assembly};
}

 

private void InspectAssembly(Assembly assembly, ICollection<ComponentInfo> componentList, ICollection<Type> configs)
{
    var types = assembly.GetExportedTypes();

    foreach (var type in types)
    {
        foreach (var attribute in type.GetCustomAttributes(true).OfType<RegisterAttribute>())
            componentList.Add(attribute.GetComponentInfo(type));
    }

    foreach (var type in types)
    {
        if(_configType.IsAssignableFrom(type) && !type.IsAbstract)
            configs.Add(type);
    }
}


总的来说,我们只要加载dll,挂上标签就可以自动注册了

内置服务+自定义服务注册好以后,接下来的任务就是注册实例.即组件的生命周期状况.内置都为Singleton

/// <summary>
/// The lifetime of a Caliburn component.
/// </summary>
public enum ComponentLifetime
{
    /// <summary>
    /// One instance per application.
    /// </summary>
    Singleton,
    /// <summary>
    /// A new instance is created on each request.
    /// </summary>
    PerRequest,
    /// <summary>
    /// A new instance is created per custom lifetime rules.
    /// </summary>
    Custom
}


可以通过重写ConfigureWith方法,使用第三方容器来注册服务,当然其内置也提供了一个较为简单的容器

新版本可能会更新,所以不去研究它了

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2006-12-30 asp.net控件开发基础(15)
点击右上角即可分享
微信分享提示