一、简介
StructureMap 是一个开源的.NET依赖注入框架,用于管理和解析对象之间的依赖关系。它提供了一种简单而灵活的方式,用于在应用程序中使用依赖注入。StructureMap在.net framework已经存在,属于.NET比较老牌的依赖注入框架,在.NET Core中的使用与.net framework完全不同,如果项目升级需要注意写法。本文将介绍StructureMap在.NET7的使用,当然也适用.NET5以上版本。.
二、在ASP.NET Core 7中使用
1、新建一个ASP.NET Core7 API项目,如下图

2、安装StructureMap包
在vs中点击项目右键,选择“管理Nuget程序包”,在打开的界面选择“浏览”,在浏览的搜索框中输入StructureMap,选择第一个安装,如下图。也可以通过命令安装。

命令的方式安装
Install-Package StructureMap3、在项目中新建测试类,
有个接口,三个类,最后一个类封装的依赖注入。
namespace StructureMapTest.Code{ //接口public interface IStructureMapService{string GetMessage();}//常规的实现测试public class BuiltInDiIStructureMapService : IStructureMapService{public string GetMessage(){return "内置依赖注入!";}}//StructureMap的实现测试public class StructureMapService: IStructureMapService{public string GetMessage(){return "Structuremap 依赖注入!";}}//封装的依赖注入类,可以进行多个注入public class MyStructuremapRegistry : Registry{public MyStructuremapRegistry(){For<IStructureMapService>().LifecycleIs(Lifecycles.Container).Use<StructureMapService>();}}}
4、在Program.cs注册组件
//默认的注册方法,这里列出便于对比//builder.Services.AddTransient<IStructureMapService, BuiltInDiIStructureMapService>();//Structuremap注册 这里选择了单例,在Structuremap也只能单例builder.Services.AddSingleton<IContainer>(container => new Container(x =>{x.AddRegistry<MyStructuremapRegistry>();//也可以直接注入//x.For<IStructureMapService>().Use<StructureMapService>();}));
5、在控制器中使用
这里也是构造方法注入,跟普通的有点区别,代码如下:
public class HomeController : ControllerBase{private readonly IStructureMapService _messagingService;public HomeController(IContainer container)//这里是IContainer{ //需要调用GetInstance_messagingService = container.GetInstance<IStructureMapService>(); ;}[HttpGet][Route("StructureMap")]public IActionResult Index(){var content = _messagingService.GetMessage();return Ok(content);}}
6、在接口中查看效果

完美得实现效果。
三、StructureMap 的生命周期
在使用 StructureMap 进行依赖注入时,我们可以指定对象的生命周期,以控制对象的创建和销毁时机。StructureMap 支持如下5种生命周期:
Transient 生命周期:每次请求创建新的实例,不维护任何状态。
container.For<IUserService>().Use<UserService>().Transient();Singleton 生命周期:整个应用程序中只创建一个实例,对于单个请求,返回同一个实例。
container.For<IUserService>().Use<UserService>().Singleton();Thread-local 生命周期:每个线程创建一个实例,对于同一线程,返回同一个实例。
container.For<IUserService>().Use<UserService>().ThreadScoped();ContainerScoped 生命周期:在唯一的根、子或嵌套容器中只会创建一个对象实例。
var container = new Container(_ =>{_.ForConcreteType<Disposable>().Configure.ContainerScoped();});
AlwaysUnique 生命周期:每次创建新的对象实例,即使在同一对象中也是如此。
var c = new Container(x => { x.For<IService>().Use<Service>().AlwaysUnique(); });使用不同的生命周期可以优化对象的创建和销毁,提高应用程序的性能。具体的选择应该根据应用程序的需求和对象的特性进行考虑。生命周期主要针对自定义注入,具体大家可以试一试。
结语
本文介绍了开源依赖注入组件StructureMap和它的使用,并介绍了几种生命周期。StructureMap的功能还有很多,本文篇幅有限就不列出,具体在项目使用需要根据具体情况来定,本文仅供参考,具体请参考官方文档。
官网:https://structuremap.github.io/