AutoFac注册的动态实例 Named和Keyed
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: prometheus连续查询_Prome
- 下一篇: 笔记:CAN收发器-TJA1051T与T