国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.NET 6 整合 Autofac 依賴注入容器

這篇具有很好參考價(jià)值的文章主要介紹了.NET 6 整合 Autofac 依賴注入容器。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

一行業(yè)務(wù)代碼還沒寫,框架代碼一大堆,不利于學(xué)習(xí)。
??吹絡(luò)ava的學(xué)習(xí)資料或博客,標(biāo)題一般為《SpringBoot 整合 XXX》,所以仿照著寫了《.NET 6 整合 Autofac 依賴注入容器》這樣一個(gè)標(biāo)題。
以下是我自己的用法,可能不是最佳實(shí)踐。

一. 引用包

NuGet搜索并安裝:
Autofac
Autofac.Extensions.DependencyInjection

二. 配置代碼

var builder = WebApplication.CreateBuilder(args);

...省略

// ASP.NET Core整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());//通過工廠替換,把Autofac整合進(jìn)來
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    ServiceFactory.SetBuilder(containerBuilder);
    ServiceFactory.RegisterAssembly(Assembly.GetExecutingAssembly()); //注冊服務(wù)
});

var app = builder.Build();

ServiceFactory.SetContainer((app.Services as AutofacServiceProvider).LifetimeScope as IContainer);
Task.Run(async () => await ServiceFactory.StartAllService()); //啟動服務(wù),注意:服務(wù)啟動完成之前,調(diào)用接口會異常

...省略

三. 服務(wù)的自動注冊、啟動、停止

IService接口

/// <summary>
/// 服務(wù)接口
/// </summary>
public interface IService
{
    /// <summary>
    /// 服務(wù)啟動
    /// </summary>
    Task OnStart();

    /// <summary>
    /// 服務(wù)停止
    /// </summary>
    Task OnStop();
}

RegisterServiceAttribute特性

/// <summary>
/// 注冊為服務(wù)
/// </summary>
public class RegisterServiceAttribute : Attribute
{
}

ServiceBase抽像類

[RegisterService]
public abstract class ServiceBase : IService
{
    #region OnStart
    public virtual Task OnStart()
    {
        return Task.CompletedTask;
    }
    #endregion

    #region OnStop
    public virtual Task OnStop()
    {
        return Task.CompletedTask;
    }
    #endregion

}

ServiceFactory服務(wù)工廠類

public class ServiceFactory
{
    private static ContainerBuilder _builder;

    private static IContainer _container;

    private static bool _isRunning; //服務(wù)是否正在運(yùn)行

    public static void SetBuilder(ContainerBuilder builder)
    {
        _builder = builder;
    }

    public static void SetContainer(IContainer container)
    {
        _container = container;
    }

    /// <summary>
    /// Autofac.ContainerBuilder
    /// </summary>
    public static ContainerBuilder Builder
    {
        get
        {
            return _builder;
        }
    }

    /// <summary>
    /// 獲取服務(wù)
    /// </summary>
    /// <typeparam name="T">接口類型</typeparam>
    public static T Get<T>()
    {
        if (_isRunning)
        {
            return _container.Resolve<T>();
        }
        else
        {
            throw new Exception("服務(wù)尚未啟動完成");
        }
    }

    /// <summary>
    /// 獲取服務(wù)
    /// </summary>
    /// <param name="type">接口類型</param>
    public static object Get(Type type)
    {
        if (_isRunning)
        {
            return _container.Resolve(type);
        }
        else
        {
            throw new Exception("服務(wù)尚未啟動完成");
        }
    }

    #region 注冊程序集
    /// <summary>
    /// 注冊程序集
    /// </summary>
    /// <param name="serviceAssembly">服務(wù)程序集</param>
    public static void RegisterAssembly(Assembly serviceAssembly)
    {
        Type[] typeArr = serviceAssembly.GetTypes();

        foreach (Type type in typeArr)
        {
            if (type.GetCustomAttribute<RegisterServiceAttribute>() != null && !type.IsAbstract)
            {
                _builder.RegisterType(type).SingleInstance().AsImplementedInterfaces().AsSelf();
            }
            else
            {
                Type[] interfaceTypes = type.GetInterfaces();
                foreach (Type interfaceType in interfaceTypes)
                {
                    if (interfaceType.GetCustomAttribute<RegisterServiceAttribute>() != null && !type.IsAbstract)
                    {
                        _builder.RegisterType(type).SingleInstance().AsImplementedInterfaces().AsSelf();
                        break;
                    }
                }
            }
        }

        //_container = _builder.Build();
    }
    #endregion

    #region 啟動所有服務(wù)
    /// <summary>
    /// 啟動所有服務(wù)
    /// </summary>
    public static async Task StartAllService()
    {
        Type iServiceInterfaceType = typeof(IService);
        IEnumerable<Type> types = _container.ComponentRegistry.Registrations.Select(a => a.Activator.LimitType);
        await Parallel.ForEachAsync(types, async (type, c) =>
        {
            if (iServiceInterfaceType.IsAssignableFrom(type))
            {
                object obj = _container.Resolve(type);

                try
                {
                    IService service = obj as IService;
                    await service.OnStart();
                    LogUtil.Info("服務(wù) " + obj.GetType().FullName + " 已啟動");
                }
                catch (Exception ex)
                {
                    LogUtil.Error(ex, "服務(wù) " + obj.GetType().FullName + " 啟動失敗");
                }
            }
        });
        _isRunning = true;
    }
    #endregion

    #region 停止所有服務(wù)
    /// <summary>
    /// 停止所有服務(wù)
    /// </summary>
    public static async Task StopAllService()
    {
        Type iServiceInterfaceType = typeof(IService);
        IEnumerable<Type> types = _container.ComponentRegistry.Registrations.Select(a => a.Activator.LimitType);
        await Parallel.ForEachAsync(types, async (type, c) =>
        {
            if (iServiceInterfaceType.IsAssignableFrom(type))
            {
                object obj = _container.Resolve(type);
                IService service = obj as IService;

                try
                {
                    await service.OnStop();
                    LogUtil.Info("服務(wù) " + obj.GetType().FullName + " 已停止");
                }
                catch (Exception ex)
                {
                    LogUtil.Error(ex, "服務(wù) " + obj.GetType().FullName + " 停止失敗");
                }
            }
        });
        _isRunning = false;
    }
    #endregion

}

ServiceFactory的簡寫類

/// <summary>
/// ServiceFactory的簡寫
/// </summary>
public class SF
{
    /// <summary>
    /// 獲取服務(wù)
    /// </summary>
    /// <typeparam name="T">接口類型</typeparam>
    public static T Get<T>()
    {
        return ServiceFactory.Get<T>();
    }

    /// <summary>
    /// 獲取服務(wù)
    /// </summary>
    /// <param name="type">接口類型</param>
    public static object Get(Type type)
    {
        return ServiceFactory.Get(type);
    }
}

編寫服務(wù)類

服務(wù)類示例1

/// <summary>
/// 測試服務(wù)
/// </summary>
public class TestService : ServiceBase
{
    public async Task<string> GetValue()
    {
        return await Task.FromResult("測試數(shù)據(jù)");
    }
}

服務(wù)類示例2

重寫了OnStart和OnStop以實(shí)現(xiàn)服務(wù)的啟動和停止。文章來源地址http://www.zghlxwxcb.cn/news/detail-426026.html

/// <summary>
/// 定時(shí)任務(wù)管理
/// </summary>
public class ScheduleJobs : ServiceBase
{
    #region 變量
    private IScheduler _scheduler;
    #endregion

    #region OnStart
    public override async Task OnStart()
    {
        try
        {
            NameValueCollection options = new NameValueCollection();
            string schedulerName = "DefaultQuartzScheduler";
            options.Add("quartz.scheduler.instanceName", schedulerName);
            StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(options);
            _scheduler = await schedulerFactory.GetScheduler(schedulerName);
            if (_scheduler == null)
            {
                _scheduler = await schedulerFactory.GetScheduler();
            }
            await _scheduler.Start();
            AddJobs(_scheduler);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    #endregion

    #region OnStop
    public override async Task OnStop()
    {
        await _scheduler.Shutdown();
    }
    #endregion

    #region ScheduleJob
    private async Task ScheduleJob<T>(IScheduler scheduler, string cronString) where T : IJob
    {
        IJobDetail jobDetail = JobBuilder.Create<T>().Build();
        ITrigger trigger = TriggerBuilder.Create().WithCronSchedule(cronString).Build();
        await scheduler.ScheduleJob(jobDetail, trigger);
    }
    #endregion

    private async void AddJobs(IScheduler scheduler)
    {
        await ScheduleJob<TestJob>(scheduler, "0/30 * * * * ?");
    }

}

構(gòu)造注入示例

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    private readonly TestService _testService;

    public TestController(TestService testService)
    {
        _testService = testService;
    }

    ...省略
}

也可以這樣使用

var value = await SF.Get<TestService>().GetValue();

到了這里,關(guān)于.NET 6 整合 Autofac 依賴注入容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器實(shí)現(xiàn)MVVM雙向綁定和依賴注入

    【.NET6+WPF】WPF使用prism框架+Unity IOC容器實(shí)現(xiàn)MVVM雙向綁定和依賴注入

    前言:在C/S架構(gòu)上,WPF無疑已經(jīng)是“桌面一霸”了。在.NET生態(tài)環(huán)境中,很多小伙伴還在使用Winform開發(fā)C/S架構(gòu)的桌面應(yīng)用。但是WPF也有很多年的歷史了,并且基于MVVM的開發(fā)模式,受到了很多開發(fā)者的喜愛。 并且隨著工業(yè)化的進(jìn)展,以及幾年前微軟對.NET平臺的開源,國內(nèi)大多

    2024年02月06日
    瀏覽(28)
  • .NET開源IOC內(nèi)置容器,生命周期管理與Autofac擴(kuò)展

    .NET開源IOC內(nèi)置容器,生命周期管理與Autofac擴(kuò)展

    大家好,我是行不更名,坐不改姓的宋曉剛,下面將帶領(lǐng)大家從基礎(chǔ)小白到高階的.NET的IOC容器依賴與注入,以及IOC內(nèi)置容器和生命周期,Autofac的學(xué)習(xí),跟上我的步伐進(jìn)入C#的世界。 微信:15319589104 QQ: 2981345658 文章內(nèi)容: .NET依賴注入容器的生命周期管理,瞬時(shí)生命周期(

    2024年01月21日
    瀏覽(18)
  • .net下優(yōu)秀的IOC容器框架Autofac的使用方法,實(shí)例解析

    .net下優(yōu)秀的IOC容器框架Autofac的使用方法,實(shí)例解析

    Autofac是一個(gè)功能強(qiáng)大的依賴注入容器,它提供了一種簡單和靈活的方式來管理對象之間的依賴關(guān)系。下面是Autofac的一些優(yōu)點(diǎn): 簡單易用:Autofac提供了一種直觀和簡潔的方式來注冊和解析依賴項(xiàng)。它的API設(shè)計(jì)得非常易于理解和使用,使得開發(fā)人員可以輕松地配置和管理依賴關(guān)

    2024年02月05日
    瀏覽(22)
  • 【ASP.NET Core 基礎(chǔ)知識】--依賴注入(DI)--什么是依賴注入

    依賴注入(Dependency Injection,簡稱DI)是一種設(shè)計(jì)模式,用于解耦和管理類之間的依賴關(guān)系。它的核心思想是將原本需要在代碼中顯式創(chuàng)建的依賴關(guān)系,交給外部容器進(jìn)行控制和管理。 具體來說,依賴注入的實(shí)現(xiàn)方式是通過將依賴對象的創(chuàng)建和維護(hù)責(zé)任轉(zhuǎn)移到外部容器中,使

    2024年01月23日
    瀏覽(89)
  • .NET Core 依賴注入

    在.NET Core中,依賴注入(Dependency Injection,簡稱DI)是框架的一個(gè)重要特性,可以幫助我們解耦代碼、管理對象生命周期以及提高可測試性等.一下是.NET Core中依賴注入的一些基本概念和用法: 1、服務(wù)(Service):在DI中,服務(wù)即一個(gè)對象或者類型。用于完成特定的功能.例如,數(shù)據(jù)庫訪

    2023年04月24日
    瀏覽(94)
  • .NET使用依賴注入,控制反轉(zhuǎn)

    .NET 支持依賴項(xiàng)注入 (DI) 軟件設(shè)計(jì)模式,這是一種在類及其依賴項(xiàng)之間實(shí)現(xiàn) 控制 (IoC) 的反轉(zhuǎn) 的技術(shù) 避免有狀態(tài)的、靜態(tài)類和成員。 通過將應(yīng)用設(shè)計(jì)為改用單一實(shí)例服務(wù),避免創(chuàng)建全局狀態(tài)。 避免在服務(wù)中直接實(shí)例化依賴類。 直接實(shí)例化會將代碼耦合到特定實(shí)現(xiàn)。 不在服務(wù)

    2023年04月16日
    瀏覽(28)
  • .NET 通過源碼深究依賴注入原理

    .NET 通過源碼深究依賴注入原理

    依賴注入 (DI) 是.NET中一個(gè)非常重要的軟件設(shè)計(jì)模式,它可以幫助我們更好地管理和組織組件,提高代碼的可讀性,擴(kuò)展性和可測試性。在日常工作中,我們一定遇見過這些問題或者疑惑。 Singleton服務(wù)為什么不能依賴Scoped服務(wù)? 多個(gè)構(gòu)造函數(shù)的選擇機(jī)制? 源碼是如何識別循環(huán)

    2024年02月05日
    瀏覽(30)
  • .Net依賴注入神器Scrutor(上)

    從.Net Core 開始,.Net 平臺內(nèi)置了一個(gè)輕量,易用的 IOC 的框架,供我們在應(yīng)用程序中使用,社區(qū)內(nèi)還有很多強(qiáng)大的第三方的依賴注入框架如: Autofac DryIOC Grace LightInject Lamar Stashbox Simple Injector 內(nèi)置的依賴注入容器基本可以滿足大多數(shù)應(yīng)用的需求,除非你需要的特定功能不受它支

    2024年03月19日
    瀏覽(42)
  • .Net6.0系列-7 依賴注入(一)

    依賴注入(Dependency Injection,DI)是控制反轉(zhuǎn)(Inversion of Control,IOC)思想的實(shí)現(xiàn)方式,依賴注入簡化模塊的組裝過程,降低模塊之間的耦合度. DI的幾個(gè)概念: 服務(wù)(Service):和框架請求之后返回的一個(gè)對象,可以是一個(gè)數(shù)據(jù)庫鏈接,也可以是一個(gè)文件處理的方法,或者是數(shù)據(jù)處理的一個(gè)過程方法

    2023年04月11日
    瀏覽(21)
  • ASP.NET Core 依賴注入系列一

    ASP.NET Core 依賴注入系列一

    什么是ASP.NET Core 依賴注入? 依賴注入也稱DI是一項(xiàng)技術(shù)用來實(shí)現(xiàn)對象松耦合以至于應(yīng)用程序更容易維護(hù),ASP.NET Core通過控制器的構(gòu)造函數(shù)自動注入依賴的對象,我們創(chuàng)建ASP.NET Core MVC應(yīng)用程序演示依賴注入特性是如何工作, 在這節(jié)中我們講解該特性 1 例子 我們創(chuàng)建一個(gè)ASP.NET C

    2024年02月11日
    瀏覽(98)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包