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");
复制代码

 

posted @   陈鹏昱Chen  阅读(2789)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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)
点击右上角即可分享
微信分享提示