您现在的位置是:首页 >学无止境 >.NET使用依赖注入,控制反转网站首页学无止境

.NET使用依赖注入,控制反转

棉晗榜 2023-05-19 12:00:02
简介.NET使用依赖注入,控制反转

.NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术

在设计能够进行依赖注入的服务时:

  • 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。
  • 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。
  • 不在服务中包含过多内容,确保设计规范,并易于测试。

如果一个类有很多已注入的依赖关系,这可能表明该类拥有过多的责任,并且违反了单一责任原则 (SRP)。 尝试通过将某些职责移动到一个新类来重构类。

使用的包Microsoft.Extensions.DependencyInjection

参考微软文档

.NET 依赖项注入
https://learn.microsoft.com/zh-cn/dotnet/core/extensions/dependency-injection

使用依赖关系注入
https://learn.microsoft.com/zh-cn/dotnet/core/extensions/dependency-injection-usage

依赖关系注入指南
https://learn.microsoft.com/zh-cn/dotnet/core/extensions/dependency-injection-guidelines

Program.cs

using WzfgsInfoReportNET6.IBLL;
using WzfgsInfoReportNET6.IBLL_impl;
using WzfgsInfoReportNET6.IDao;
using WzfgsInfoReportNET6.IDao_impl;
using WzfgsInfoReportNET6.Models;


var builder = WebApplication.CreateBuilder(args);

#region 业务层接口,实现注册

builder.Services.AddSingleton<IAnMenusBll, AnMenusBll>();
builder.Services.AddSingleton<IAnRoleBll, AnRoleBll>();
builder.Services.AddSingleton<IAnUserBll, AnUserBll>();
builder.Services.AddSingleton<IArticle2Bll, Article2Bll>();

#endregion

#region 数据层接口,实现注册

builder.Services.AddSingleton<IAdoptedRecordDao, AdoptedRecordDao>();
builder.Services.AddSingleton<IAnMenusDao, AnMenusDao>();
builder.Services.AddSingleton<IAnRoleDao, AnRoleDao>(); 

#endregion

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();
AppHelpter.App = app;


//var kkk = app.Services.GetRequiredService<IAnMenusDao>();
//var bbb = WebApplicationBuilderHelpter.GetServices<ITaskBll>();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

工具类,获取注册的实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace WzfgsInfoReportNET6.Models 
{
    /// <summary>
    /// 依赖注册,获取接口实例
    /// </summary>
    /// 创建时间:2023-4-11 16:48:42。作者:xxx
    public sealed class AppHelpter
    {
        /// <summary>
        /// 程序
        /// </summary>
        public static WebApplication App { get; set; }

        /// <summary>
        /// 获取接口实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T GetServices<T>() where T : notnull
        {
            T instance =  App.Services.GetRequiredService<T>();
            return instance;
        }

    }
}

调用

public class AnRoleBll : IAnRoleBll
{
        readonly IAnRoleDao anRoleDao= AppHelpter.GetServices<IAnRoleDao>();
        readonly IAnUserDao anUserDao= AppHelpter.GetServices<IAnUserDao>();
        readonly IRoleFunctionsDao roleFunctionsDao = AppHelpter.GetServices<IRoleFunctionsDao>();

        public async Task<Result> AddAsync(AnRole model)
        {          
            int count = await anRoleDao.AddAsync(model);
            if (count > 0)
            {
                return new Result(true);
            }
            return new Result("新增失败");
        }
} 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。