程序版本是.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");