C#-使用AutoFac通过配置的方式注入指定对象
程序版本是.net framework 4.5的
首先Nuget添加AutoFac, 需要读取配置的话需要再添加Autofac.Configuration
Autofac.Configuration的版本需要和AutoFac和.net版本相匹配。
这里我用 .net 4.5\autofac3.3.1\Autofac.Configuration3.3.0
在启动项目的config文件中添加sction和autofac节点配置如下:
1.通过configSource的方式
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> </configSections> <autofac configSource="AutoFac.config" /> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
这里autoFac节点使用了configSource的方式指定到另一个配置文件
AutoFac.config配置如下:
<?xml version="1.0" encoding="utf-8" ?> <autofac> <components> <component type="WebPro.Repository.StudentRepository,WebPro.WebPro.Repository" service="WebPro.Repository.IStudentRepository,WebPro.Repository" /> </components> </autofac>
这种方式需要将configSource指向的文件设置为"始终复制到输出目录",
否则会报错“System.Configuration.ConfigurationErrorsException:“无法打开 configSource 文件”
2.直接在配置文件中指定的方式:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> </configSections> <autofac> <components> <component type="WebPro.Repository.StudentRepository,WebPro.WebPro.Repository" service="WebPro.Repository.IStudentRepository,WebPro.Repository" /> </components> </autofac> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
然后使用ConfigurationSettingsReader读取。附上C#的IOC容器类的完整代码:
using Autofac; using Autofac.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WebPro.Core.IOC { public sealed class Container :IDisposable { private static IContainer container; public static void instance() { var builder = new ContainerBuilder(); builder.RegisterModule(new ConfigurationSettingsReader("autofac")); container = builder.Build(); } /// <summary> /// 从IOC容器内取回指定的对象 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T Resove<T>() { try { if (container == null) instance();return container.Resolve<T>(); } catch (Exception ex) { throw; } } public void Dispose() { container.Dispose(); GC.SuppressFinalize(this); } } }
读取的时候报了这个错:
The type 'WebPro.Repository.StudentRepository,WebPro.Repository.' could not be found. It may require assembly qualification, e.g. "MyType, MyAssembly".
一直以为配置是 "类全名,命名空间" 的格式,看了他的提示"e.g. "MyType, MyAssembly""才知道,应该是用"类全名,程序集名称"才对,也就是逗号后面的应该是所在项目的项目名称。
修改config文件后运行成功,调用:
IStudentRepository rep =Container.Resolve<IStudentRepository>();
当然写起来最简单的方式还是直接使用RegisterType方法,但是这样的话容器所在的项目就需要添加上需要注入的对象所在项目的引用,也就是添加依赖项;使用配置的方法的话就不需要添加依赖。
使用RegisterType方法的简单示例:
IContainer container = null; var builder = new ContainerBuilder(); builder.RegisterType<StudentRepository>().As<IStudentRepository>(); //builder.RegisterType<StudentRepository>().Named<IStudentRepository>("StudentRepositoryEx"); container = builder.Build(); var manager = container.Resolve<IStudentRepository>(); //var manager = container.ResolveNamed<IStudentRepository>("StudentRepositoryEx");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)