AutoFac注册的动态实例 Named和Keyed
named和keyed是有多個實現(xiàn)時,應用程序根據(jù)不同參數(shù)或不同場景下進行選擇性實例。(我理解是這樣的,能想到的場景:支付(根據(jù)用戶選擇實例 支付寶或微信))
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())//注冊整個程序集
.Where(n => n.Name.EndsWith("Service")).AsImplementedInterfaces()//注冊程序集內(nèi)以Service結(jié)尾的文件
.SingleInstance();//單例模式
//.InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())
.Where(n => n.Name.EndsWith("Repository")).AsImplementedInterfaces()//注冊程序集內(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
這里是注冊代碼的截圖與AutofacModule代碼,用不同顏色框標識了named 和keyed。(黃色是固定注冊;藍色是同時注冊了兩個不同的實現(xiàn),用named區(qū)分;褐色是同時注冊了兩個不同的實現(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
黃色選中是固定注冊,在構(gòu)造函數(shù)中直接注入使用就可以。
藍色和褐色選中的為 named和keyed,都需要使用到 autofac的IComponentContext上下文對象,通過構(gòu)造注入即可.
根據(jù)傳來的不同參數(shù)確定使用哪個實例。
官方解釋:https://autofaccn.readthedocs.io/zh/latest/advanced/keyed-services.html?highlight=named
我個人認為named更方便些可以使用 實現(xiàn)的類名當做named :
builder.RegisterType<twoUserService>().Named<IUserService>(nameof(twoUserService)).As<IUserService>().InstancePerDependency();
(注:以上 AutofacModule中使用named注冊的時候是一個一個注冊的, 可以使用批量注冊,以下是批量注冊和使用,不清楚這種方式是不是更好一些。)
#region 批量注冊
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()
);
}
}
批量注冊
#endregion 批量注冊結(jié)束
演示結(jié)果:userService 在名字前加了一個字符串“7788”
twoUserService取出數(shù)據(jù)沒做操作
keyid=1 實例的是userService 輸出名字“7788Duh”;
kid=2實例的是twouserService 輸出名字“DuhDuh”;
( 注:name:duhduh 兩遍是用automapper做的兩個字段映射,不用在意。)
AutoFac生命周期https://autofaccn.readthedocs.io/zh/latest/lifetime/instance-scope.html
每個依賴一個實例(Instance Per Dependency)
單一實例(Single Instance)
每個生命周期作用域一個實例(Instance Per Lifetime Scope)
每個匹配的生命周期作用域一個實例(Instance Per Matching Lifetime Scope)
每個請求一個實例(Instance Per Request)
每次被擁有一個實例(Instance Per Owned)
線程作用域(Thread Scope)
僅供參考,內(nèi)容中會引用部分博友的文章。(侵刪)
總結(jié)
以上是生活随笔為你收集整理的AutoFac注册的动态实例 Named和Keyed的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: prometheus连续查询_Prome
- 下一篇: 笔记:CAN收发器-TJA1051T与T