日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

AutoFac注册的动态实例 Named和Keyed

發(fā)布時(shí)間:2023/12/13 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 AutoFac注册的动态实例 Named和Keyed 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

named和keyed是有多個(gè)實(shí)現(xiàn)時(shí),應(yīng)用程序根據(jù)不同參數(shù)或不同場(chǎng)景下進(jìn)行選擇性實(shí)例。(我理解是這樣的,能想到的場(chǎng)景:支付(根據(jù)用戶選擇實(shí)例 支付寶或微信))

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AdminWebApi.IServices;
using AdminWebApi.Service;
using Autofac;

namespace AdminWebApi.Autofac
{
    public class AutofacMoule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())//注冊(cè)整個(gè)程序集
                .Where(n => n.Name.EndsWith("Service")).AsImplementedInterfaces()//注冊(cè)程序集內(nèi)以Service結(jié)尾的文件
                .SingleInstance();//單例模式
            //.InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())
         .Where(n => n.Name.EndsWith("Repository")).AsImplementedInterfaces()//注冊(cè)程序集內(nèi)以Repository結(jié)尾的文件
         .SingleInstance();

            builder.RegisterType<twoUserService>().As<IUserService>().SingleInstance();

            builder.RegisterType<twoUserService>().Named<IUserService>("two").As<IUserService>().InstancePerDependency();
            builder.RegisterType<UserService>().Named<IUserService>("one").As<IUserService>().InstancePerDependency();

            builder.RegisterType<UserService>().Keyed<IUserService>(keyid.one).As<IUserService>().InstancePerDependency();
            builder.RegisterType<twoUserService>().Keyed<IUserService>(keyid.two).As<IUserService>().InstancePerDependency();
        }
    }
    public enum keyid
    {
        one = 1,
        two = 2
    }
}

AutofacModule

這里是注冊(cè)代碼的截圖與AutofacModule代碼,用不同顏色框標(biāo)識(shí)了named 和keyed。(黃色是固定注冊(cè);藍(lán)色是同時(shí)注冊(cè)了兩個(gè)不同的實(shí)現(xiàn),用named區(qū)分;褐色是同時(shí)注冊(cè)了兩個(gè)不同的實(shí)現(xiàn),用keyed區(qū)分)

 public class AdminUserController : ControllerBase
    {
       
        public IUserService _userservice;
        private readonly IMapper _mapper;
        private readonly IComponentContext componentContext;

        public AdminUserController(IUserService userService,IMapper mapper,IComponentContext componentContext)
        {
            _userservice = userService;
            this._mapper = mapper;
            this.componentContext = componentContext;
            
        }
        [HttpGet("getuserByid")]
        public async Task<UsersDto> GetDtoAsync(int uid,int utype,int ukeyid)
        {
            switch (utype)
            {
                case 1: _userservice = componentContext.ResolveNamed<IUserService>("one"); break;
                case 2: _userservice = componentContext.ResolveNamed<IUserService>("two");break;
                default: break ;
            }
            switch (ukeyid)
            {
                case 1: _userservice = componentContext.ResolveKeyed<IUserService>(keyid.one); break;
                case 2: _userservice = componentContext.ResolveKeyed<IUserService>(keyid.two); break;
            }

            //var two = container.ResolveNamed<IUserService>("two");
            //builder.Build().ResolveNamed<IUserService>("two");
            return  await _userservice.GetUsers(uid);
        }
}

控制器代碼:Adminusercontroller

黃色選中是固定注冊(cè),在構(gòu)造函數(shù)中直接注入使用就可以。

藍(lán)色和褐色選中的為 named和keyed,都需要使用到 autofac的IComponentContext上下文對(duì)象,通過構(gòu)造注入即可.

根據(jù)傳來的不同參數(shù)確定使用哪個(gè)實(shí)例。

官方解釋:https://autofaccn.readthedocs.io/zh/latest/advanced/keyed-services.html?highlight=named

我個(gè)人認(rèn)為named更方便些可以使用 實(shí)現(xiàn)的類名當(dāng)做named :

builder.RegisterType<twoUserService>().Named<IUserService>(nameof(twoUserService)).As<IUserService>().InstancePerDependency();

(注:以上 AutofacModule中使用named注冊(cè)的時(shí)候是一個(gè)一個(gè)注冊(cè)的, 可以使用批量注冊(cè),以下是批量注冊(cè)和使用,不清楚這種方式是不是更好一些。)

#region 批量注冊(cè)

 public class AutofacMoule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            

            typeof(IUserService).Assembly.GetTypes()
          .Where(t => t.GetInterfaces().Contains(typeof(IUserService))).ToList()
          .ForEach(w =>
                 builder.RegisterType(w).Named<IUserService>(w.Name).As<IUserService>().InstancePerDependency()
                );

        }
    }

批量注冊(cè)

#endregion 批量注冊(cè)結(jié)束

演示結(jié)果:userService 在名字前加了一個(gè)字符串“7788”

twoUserService取出數(shù)據(jù)沒做操作

keyid=1 實(shí)例的是userService 輸出名字“7788Duh”;

kid=2實(shí)例的是twouserService 輸出名字“DuhDuh”;

( 注:name:duhduh 兩遍是用automapper做的兩個(gè)字段映射,不用在意。)

AutoFac生命周期https://autofaccn.readthedocs.io/zh/latest/lifetime/instance-scope.html

每個(gè)依賴一個(gè)實(shí)例(Instance Per Dependency)
單一實(shí)例(Single Instance)
每個(gè)生命周期作用域一個(gè)實(shí)例(Instance Per Lifetime Scope)
每個(gè)匹配的生命周期作用域一個(gè)實(shí)例(Instance Per Matching Lifetime Scope)
每個(gè)請(qǐng)求一個(gè)實(shí)例(Instance Per Request)
每次被擁有一個(gè)實(shí)例(Instance Per Owned)
線程作用域(Thread Scope)

僅供參考,內(nèi)容中會(huì)引用部分博友的文章。(侵刪)

總結(jié)

以上是生活随笔為你收集整理的AutoFac注册的动态实例 Named和Keyed的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。