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();
        }

        /// 
        /// 从IOC容器内取回指定的对象
        /// 
        /// 
        /// 
        public static T Resove()
        {
            try
            {
                if (container == null)
                    instance();return container.Resolve();
            }
            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().As();
 //builder.RegisterType().Named("StudentRepositoryEx");
 container = builder.Build();

 var manager = container.Resolve();
 //var manager = container.ResolveNamed("StudentRepositoryEx");