一、简介
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 StructureMap
3、在项目中新建测试类,
有个接口,三个类,最后一个类封装的依赖注入。
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/