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

一、简介   

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

二、在ASP.NET Core 7中使用

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

49a2aa00dfe04a11ba77ce2e1fa64188.png

2、安装StructureMap包

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

45bd004f472c53b8cd9bfb50a649c4d9.png

命令的方式安装

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

1c6c9c1a9a892c133280725c64af1d48.png

完美得实现效果。

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

参考:

1、https://structuremap.github.io/

2、https://chat.openai.com/

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

-

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值