首页
/ StructureMap项目中的属性配置详解

StructureMap项目中的属性配置详解

2025-06-19 13:51:17作者:晏闻田Solitary

引言

在依赖注入框架StructureMap中,属性(Attribute)提供了一种声明式的方式来配置依赖关系。本文将深入探讨StructureMap中属性配置的使用方法、工作原理以及最佳实践。

属性配置的设计哲学

StructureMap团队对于属性配置持有谨慎的态度,他们认为:

  1. 依赖注入框架应该尽量减少对应用代码的侵入性
  2. 避免像MEF框架那样强制开发者到处使用属性标记代码
  3. 属性配置应该作为集中式Registry配置的补充,而非替代

尽管如此,在某些场景下,属性配置仍然有其独特的优势:

  • 处理与常规约定不同的特殊情况
  • 减少频繁修改集中式Registry的需要
  • 使配置更加直观易懂

StructureMapAttribute基类

StructureMap 4.0引入了StructureMapAttribute基类,开发者可以通过继承它来创建自定义配置属性。这个基类有两个关键特点:

  1. 双重处理时机

    • 类型级别的属性在注册阶段就会被读取和应用
    • 属性和构造函数参数级别的属性则在构建计划创建时才被处理
  2. 一次性处理机制

    • 与许多框架不同,StructureMap不会在每次构建时执行属性
    • 属性仅用于确定初始构建计划

类型级别的属性配置

单例模式示例

[Singleton]属性可以应用于插件类型(通常是接口)或具体类型,将其注册为单例:

[Singleton]
public interface IService {}

[Singleton]
public class ConcreteService : IService {}

这种配置方式等同于在Registry中使用.Singleton()方法,但更加直观和集中。

成员级别的属性配置

自定义属性示例

假设我们需要创建一个从AppSettings获取值的属性,可以这样实现:

public class AppSettingAttribute : StructureMapAttribute
{
    private readonly string _key;
    
    public AppSettingAttribute(string key)
    {
        _key = key;
    }
    
    public override void Alter(IConfiguredInstance instance, PropertyInfo property)
    {
        instance.Override(property, ConfigurationManager.AppSettings[_key]);
    }
    
    public override void Alter(IConfiguredInstance instance, ParameterInfo parameter)
    {
        instance.Override(parameter, ConfigurationManager.AppSettings[_key]);
    }
}

使用示例

public class AppSettingTarget
{
    public string HomeState { get; set; }
    
    public AppSettingTarget([AppSetting("name")] string name)
    {
        Name = name;
    }
    
    public string Name { get; set; }
}

构建计划解析

当StructureMap处理上述类时,会生成如下构建计划:

PluginType: AppSettingTarget
Lifecycle: Transient
new AppSettingTarget(String name)
  ┗ String name = Value: Jeremy
Set String HomeState = Value: Missouri

值得注意的是,这些值会被"硬编码"到构建函数中。如果需要动态获取AppSettings值,可以考虑使用lambda构建器。

内置属性

StructureMap提供了一些内置属性:

  1. [ValidationMethod]

    • 用于在注册中添加环境测试
  2. [SetterProperty]

    • 显式标记需要进行属性注入的成员
  3. [DefaultConstructor]

    • 指定StructureMap应该使用的构造函数
  4. 生命周期控制属性

    • [AlwaysUnique]:每次解析都创建新实例
    • [Singleton]:单例生命周期

最佳实践

  1. 适度使用:属性配置最适合处理特殊情况,不应过度使用
  2. 一致性:团队应统一约定使用属性配置的场景
  3. 可读性:为自定义属性提供清晰的命名和文档
  4. 测试:确保属性配置在各种环境下都能正确工作

总结

StructureMap中的属性配置提供了一种灵活的方式来补充集中式配置。理解其工作原理和适用场景,可以帮助开发者在保持代码整洁的同时,实现复杂的依赖注入需求。记住,属性配置是工具而非规则,合理使用才能发挥最大价值。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
53
468
kernelkernel
deepin linux kernel
C
22
5
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
878
517
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.1 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
180
264
cjoycjoy
一个高性能、可扩展、轻量、省心的仓颉Web框架。Rest, 宏路由,Json, 中间件,参数绑定与校验,文件上传下载,MCP......
Cangjie
87
14
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
349
381
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
612
60