在.NET7中使用StructureMap实现依赖注入

一、简介   

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

二、在ASP.NET Core 7中使用

1、新建一个ASP.NET Core7 API项目,如下图

在.NET7中使用StructureMap实现依赖注入

2、安装StructureMap包

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

在.NET7中使用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、在接口中查看效果

在.NET7中使用StructureMap实现依赖注入

完美得实现效果。

三、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/