做预算查价格的网站是哪个好,可以做简单小活动的网站,肇庆做网站公司,网站备案 网站目录 .NET IoC 容器#xff08;三#xff09;AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文… 目录 .NET IoC 容器三AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文件 AOPNuget安装定义接口、实现类定义切面容器配置 参考资料 .NET IoC 容器三Autofac
Autofac
Autofac 是一个用于 .NET 应用程序的依赖注入 (Dependency Injection, DI) 容器。它帮助开发人员管理对象的创建和生命周期使得依赖项的注入更加灵活和可维护。以下是 Autofac 的主要功能和特性概述
依赖注入 (Dependency Injection)
Autofac 允许你通过构造函数、属性或方法注入依赖项。这样你可以轻松地将对象的依赖关系传递给需要它们的类从而提高代码的可测试性和可维护性。
模块化设计 (Modular Design)
Autofac 支持模块化设计可以将相关的依赖项注册逻辑分组到模块中。这使得大型应用程序的配置更加简洁和易于管理。
生命周期管理 (Lifecycle Management)
Autofac 提供多种对象生命周期管理方式例如单例 (Singleton)、每次请求 (Instance Per Dependency)、每个生命周期范围 (Instance Per Lifetime Scope) 等允许你精确控制对象的创建和销毁时机。
注册与解析 (Registration and Resolution)
Autofac 通过流畅的 API 提供了多种注册组件的方式。你可以注册类型、实例、工厂方法甚至通过扫描程序集自动注册组件。此外Autofac 的解析功能支持构造函数参数注入、命名参数注入等高级特性。
支持 AOP (Aspect-Oriented Programming)
Autofac 与 AOP 框架如 Castle Windsor集成支持横切关注点如日志记录、事务管理的处理从而使业务逻辑代码更加简洁。
集成支持
Autofac 与许多流行的 .NET 库和框架集成良好包括 ASP.NET Core、WCF、Web API、MVC 等。通过这些集成Autofac 可以轻松地管理 web 应用程序中的依赖项。
扩展性
Autofac 具有很高的扩展性可以通过自定义注册源、生命周期、解析器等方式扩展其功能以满足特定应用的需求。
Nuget 安装 实现DI
定义接口
internal interface IComputer
{
}internal interface IKeyboard
{
}internal interface IMouse
{
}internal interface IPerson
{IComputer Computer { get; set; }IKeyboard Keyboard { get; set; }IMouse Mouse { get; set; }void Work();
}定义实现类
internal class ConstructBase
{public ConstructBase() {Console.WriteLine(${this.GetType().Name} - 被构造了);}
}internal class LenovoComputer : ConstructBase, IComputer
{public LenovoComputer() : base() { }
}internal class TogarKeyboard : ConstructBase, IKeyboard
{public TogarKeyboard() : base() { }
}internal class LogitechMouse : ConstructBase, IMouse
{public LogitechMouse() : base() { }
}internal class Programmer : ConstructBase, IPerson
{public IComputer Computer { get; set; }public IKeyboard Keyboard { get; set; }public IMouse Mouse { get; set; }public Programmer(IComputer computer, IKeyboard keyboard, IMouse mouse) : base(){Computer computer;Keyboard keyboard;Mouse mouse;}public void Work(){Console.WriteLine(Programmers are building software...);}
}依赖注入
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
builder.RegisterTypeTogarKeyboard().AsIKeyboard();
builder.RegisterTypeLogitechMouse().AsIMouse();
builder.RegisterTypeProgrammer().AsIPerson();
var container builder.Build();
IPerson programmer container.ResolveIPerson();
programmer.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
Zhy.IoC.Autofac.Programmer - 被构造了
Programmers are building software...注入方式
构造函数注入 | 属性注入 | 方法注入
定义特性用来筛选属性注入
public class InjectPropertyAttribute : Attribute
{}定义实现类
public class Gamer : ConstructBase, IPerson
{public IComputer Computer { get; set; }[InjectProperty]public IKeyboard Keyboard { get; set; }public IMouse Mouse { get; set; }public Gamer(IComputer computer) : base(){Computer computer;}public void Inject(IMouse mouse){Mouse mouse;}public void Work(){Console.WriteLine(The player is playing...);}
}注入实现
// 注入顺序与编码顺序无关构造函数注入 属性注入 方法注入
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
builder.RegisterTypeTogarKeyboard().AsIKeyboard();
builder.RegisterTypeLogitechMouse().AsIMouse();
builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson();
var container builder.Build();
IPerson gamer container.ResolveIPerson();
gamer.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.Gamer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
The player is playing...结果
注入顺序构造函数注入 属性注入 方法注入
接口注册
重复注册
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
builder.RegisterTypeTogarKeyboard().AsIKeyboard();
builder.RegisterTypeLogitechMouse().AsIMouse();
builder.RegisterTypeProgrammer().AsIPerson();
builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson();
var container builder.Build();
IPerson programmer container.ResolveIPerson();
programmer.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.Gamer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
The player is playing...调换Gamer和Programmer的注册顺序
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
builder.RegisterTypeTogarKeyboard().AsIKeyboard();
builder.RegisterTypeLogitechMouse().AsIMouse();
builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).AsIPerson();
builder.RegisterTypeProgrammer().AsIPerson();
var container builder.Build();
IPerson programmer container.ResolveIPerson();
programmer.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
Zhy.IoC.Autofac.Programmer - 被构造了
Programmers are building software...结论
同一接口多次注册时后注册的会覆盖前面注册的若需要实现多重注册需要指定名称
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
builder.RegisterTypeTogarKeyboard().AsIKeyboard();
builder.RegisterTypeLogitechMouse().AsIMouse();
builder.RegisterTypeGamer()// 方法注入.OnActivating(e {IMouse mouse e.Context.ResolveIMouse();e.Instance.Inject(mouse);})// 属性注入.PropertiesAutowired((g, o) g.Name Keyboard)// 构造函数注入.UsingConstructor(typeof(IComputer)).NamedIPerson(person);
builder.RegisterTypeProgrammer().NamedIPerson(programmer);
var container builder.Build();
IPerson programmer container.ResolveNamedIPerson(programmer);
IPerson person container.ResolveNamedIPerson(person);
programmer.Work();
person.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
Zhy.IoC.Autofac.Programmer - 被构造了
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.Gamer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
Programmers are building software...
The player is playing...指定参数注册
修改接口
internal interface IMouse
{string Type { get; set; }
}修改实现类
internal class LogitechMouse : ConstructBase, IMouse
{public LogitechMouse() : base() { }public LogitechMouse(string type) : base(){Type type;}public string Type { get; set; }
}注入
var builder new ContainerBuilder();
builder.RegisterTypeLogitechMouse().WithParameter(type,502).AsIMouse();
var container builder.Build();
IMouse mouse container.ResolveIMouse();
Console.WriteLine(mouse type: mouse.Type);输出
Zhy.IoC.Autofac.LogitechMouse - 被构造了
mouse type: 502生命周期
Instance Per Dependency默认 每次请求组件时都会创建一个新的实例。这是默认的生命周期管理模式。
builder.RegisterTypeMyService().AsIMyService();Singleton 在整个容器生命周期内只有一个实例。
builder.RegisterTypeMyService().AsIMyService().SingleInstance();Instance Per Lifetime Scope 在每个生命周期范围内共享一个实例。每个生命周期范围都会创建一个新的实例但在该范围内共享该实例。
builder.RegisterTypeMyService().AsIMyService().InstancePerLifetimeScope();Instance Per Matching Lifetime Scope 在特定的生命周期范围内共享实例需要指定标记。
builder.RegisterTypeMyService().AsIMyService().InstancePerMatchingLifetimeScope(my-scope);Instance Per Request 通常用于 web 应用程序在每个 HTTP 请求期间共享一个实例。
builder.RegisterTypeMyService().AsIMyService().InstancePerRequest();Externally Owned 组件由外部代码管理生命周期Autofac 不会在容器释放时释放该实例。
builder.RegisterTypeMyService().AsIMyService().ExternallyOwned();Instance Per Dependency 每次依赖请求时都会创建一个新实例。
builder.RegisterTypeMyService().AsIMyService().InstancePerDependency();默认生命周期
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer();
var container builder.Build();
IComputer computer0 container.ResolveIComputer();
IComputer computer1 container.ResolveIComputer();
Console.WriteLine(computer0: computer0.GetHashCode());
Console.WriteLine(computer1: computer1.GetHashCode());
Console.WriteLine($computer0 computer1: {computer0 computer1});输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.LenovoComputer - 被构造了
computer0: 32347029
computer1: 22687807
computer0 computer1: False单例生命周期
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer().SingleInstance();
var container builder.Build();
IComputer computer0 container.ResolveIComputer();
IComputer computer1 container.ResolveIComputer();
Console.WriteLine(computer0: computer0.GetHashCode());
Console.WriteLine(computer1: computer1.GetHashCode());
Console.WriteLine($computer0 computer1: {computer0 computer1});输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
computer0: 32347029
computer1: 32347029
computer0 computer1: True每个周期范围一个生命周期
var builder new ContainerBuilder();
builder.RegisterTypeLenovoComputer().AsIComputer().InstancePerLifetimeScope();
var container builder.Build();
IComputer computer0 container.ResolveIComputer();
using (var scope container.BeginLifetimeScope())
{IComputer computer1 scope.ResolveIComputer();IComputer computer2 scope.ResolveIComputer();Console.WriteLine(computer0: computer0.GetHashCode());Console.WriteLine(computer1: computer1.GetHashCode());Console.WriteLine(computer2: computer2.GetHashCode());Console.WriteLine($computer0 computer1: {computer0 computer1});Console.WriteLine($computer1 computer2: {computer1 computer2});
}输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.LenovoComputer - 被构造了
computer0: 32347029
computer1: 22687807
computer2: 22687807
computer0 computer1: False
computer1 computer2: True依赖配置
Nuget 配置文件
Json
{components: [{type: Zhy.IoC.Autofac.LenovoComputer,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IComputer,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.TogarKeyboard,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IKeyboard,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.LogitechMouse,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IMouse,Zhy.IoC.Core}],parameters: {places: 4},autoActivate: true,instanceScope: singleinstance},{type: Zhy.IoC.Autofac.Programmer,Zhy.IoC.Autofac,services: [{type: Zhy.IoC.Core.IPerson,Zhy.IoC.Core}],autoActivate: true,instanceScope: singleinstance}]
}XML
?xml version1.0 encodingutf-8 ?
autofaccomponents name0typeZhy.IoC.Autofac.LenovoComputer,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IComputer,Zhy.IoC.Core //componentscomponents name1typeZhy.IoC.Autofac.TogarKeyboard,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IKeyboard,Zhy.IoC.Core //componentscomponents name2typeZhy.IoC.Autofac.LogitechMouse,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IMouse,Zhy.IoC.Core //componentscomponents name3typeZhy.IoC.Autofac.Programmer,Zhy.IoC.Autofac/typeservices name0 typeZhy.IoC.Core.IPerson,Zhy.IoC.Core //components
/autofac调用
var config new ConfigurationBuilder();
config.AddJsonFile(DI-Autofac.json);
// config.AddXmlFile(DI-Autofac.xml);
var module new ConfigurationModule(config.Build());
var builder new ContainerBuilder();
builder.RegisterModule(module);
var container builder.Build();
IPerson programmer container.ResolveIPerson();
programmer.Work();输出
Zhy.IoC.Autofac.LenovoComputer - 被构造了
Zhy.IoC.Autofac.TogarKeyboard - 被构造了
Zhy.IoC.Autofac.LogitechMouse - 被构造了
Zhy.IoC.Autofac.Programmer - 被构造了
Programmers are building software...AOP
Nuget安装 定义接口、实现类
public interface IMyService
{void DoWork();
}public void DoWork()
{Console.WriteLine(Doing work...);
}定义切面
using Castle.DynamicProxy;public class LoggingInterceptor : IInterceptor
{public void Intercept(IInvocation invocation){Console.WriteLine($Invoking method {invocation.Method.Name} at {DateTime.Now});invocation.Proceed();Console.WriteLine($Method {invocation.Method.Name} has completed at {DateTime.Now});}
}容器配置
var builder new ContainerBuilder();
builder.Register(c new LoggingInterceptor());
builder.RegisterTypeMyService().AsIMyService().EnableInterfaceInterceptors().InterceptedBy(typeof(LoggingInterceptor));
var container builder.Build();
var service container.ResolveIMyService();
service.DoWork();输出
Invoking method DoWork at 2024/5/30 16:49:34
Doing work...
Method DoWork has completed at 2024/5/30 16:49:34参考资料
IOC容器之Unity与AutoFac_unity autofac-CSDN博客
Autofac/src/Autofac at develop · autofac/Autofac (github.com)
控制容器的反转和依赖关系注入模式 (martinfowler.com) 文章转载自: http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.pwggd.cn.gov.cn.pwggd.cn http://www.morning.baohum.com.gov.cn.baohum.com http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.fglth.cn.gov.cn.fglth.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn http://www.morning.jokesm.com.gov.cn.jokesm.com http://www.morning.mfct.cn.gov.cn.mfct.cn http://www.morning.mwhqd.cn.gov.cn.mwhqd.cn http://www.morning.jrqw.cn.gov.cn.jrqw.cn http://www.morning.jhrlk.cn.gov.cn.jhrlk.cn http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn http://www.morning.yrccw.cn.gov.cn.yrccw.cn http://www.morning.yhwxn.cn.gov.cn.yhwxn.cn http://www.morning.pynzj.cn.gov.cn.pynzj.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.ybgyz.cn.gov.cn.ybgyz.cn http://www.morning.mbfkt.cn.gov.cn.mbfkt.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.tsmxh.cn.gov.cn.tsmxh.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn http://www.morning.kzrg.cn.gov.cn.kzrg.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.tqjwx.cn.gov.cn.tqjwx.cn http://www.morning.kybpj.cn.gov.cn.kybpj.cn http://www.morning.frsbf.cn.gov.cn.frsbf.cn http://www.morning.ntgrn.cn.gov.cn.ntgrn.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn http://www.morning.cfybl.cn.gov.cn.cfybl.cn http://www.morning.cthkh.cn.gov.cn.cthkh.cn http://www.morning.dwyyf.cn.gov.cn.dwyyf.cn http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn http://www.morning.nzms.cn.gov.cn.nzms.cn http://www.morning.xmttd.cn.gov.cn.xmttd.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.qrsrs.cn.gov.cn.qrsrs.cn http://www.morning.hrkth.cn.gov.cn.hrkth.cn http://www.morning.mrxgm.cn.gov.cn.mrxgm.cn http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.pmmrb.cn.gov.cn.pmmrb.cn http://www.morning.wjjxr.cn.gov.cn.wjjxr.cn http://www.morning.bkppb.cn.gov.cn.bkppb.cn http://www.morning.rcttz.cn.gov.cn.rcttz.cn http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn http://www.morning.bpmtr.cn.gov.cn.bpmtr.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.srmpc.cn.gov.cn.srmpc.cn http://www.morning.rfpb.cn.gov.cn.rfpb.cn http://www.morning.mltsc.cn.gov.cn.mltsc.cn http://www.morning.qlsyf.cn.gov.cn.qlsyf.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.lblsx.cn.gov.cn.lblsx.cn http://www.morning.jftl.cn.gov.cn.jftl.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.jtszm.cn.gov.cn.jtszm.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.xnlj.cn.gov.cn.xnlj.cn http://www.morning.bnqcm.cn.gov.cn.bnqcm.cn http://www.morning.sfwcb.cn.gov.cn.sfwcb.cn http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn http://www.morning.sbncr.cn.gov.cn.sbncr.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.pcgmw.cn.gov.cn.pcgmw.cn http://www.morning.lylkh.cn.gov.cn.lylkh.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.ptqbt.cn.gov.cn.ptqbt.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.qnrpj.cn.gov.cn.qnrpj.cn