上次提到了AutoFac的使用,不过讲了比较简单这次来具体讲下是怎么使用
首先你必须获取AutoFac,这里你可以通过各种方式加载它,我这里还是通过VS中的NuGet来加载AutoFac.最终就是将 Autofac.dll,Autofac.Configuration.dll 这两个程序集引用到你的项目中.
1.AutoFac的基本使用
新建一项目,通过Nuget直接添加Autofac
定义一接口
/// <summary>
/// 数据源操作接口
/// </summary>
public interface IDataSource
{
/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
string GetData();
}
实现此接口
方法A
/// <summary>
/// SQLSERVER数据库
/// </summary>
class Sqlserver : IDataSource
{
public string GetData()
{
return "通过SQLSERVER获取数据";
}
}
方法B
/// <summary>
/// ORACLE数据库
/// </summary>
public class Oracle : IDataSource
{
public string GetData()
{
return "通过Oracle获取数据";
}
}
然后实现构造函数注入,Autofac可以通过构造函数注入和属性注入
var builder = new ContainerBuilder();
builder.RegisterType<DataSourceManager>();
builder.RegisterType<Sqlserver>().As<IDataSource>();
using (var container = builder.Build())
{
var manager = container.Resolve<DataSourceManager>();
Console.WriteLine(manager.GetData());
Console.ReadLine();
}
然后设置Autofac实现依赖注入
var builder = new ContainerBuilder();
builder.RegisterType<demotest>();
builder.RegisterType<testa>().As<Itest>();
using (var container = builder.Build())
{
var demo= container.Resolve<demotest>();
var str = demo.msg();
}
从此列子可以发现Autofac中关键点就是这个Container容器类
2.AutoFac常用方法说明
(1)builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。例如下面就是注册接口Itest的实例testa
(2)IContainer.Resolve<Itest>() 解析某个接口的实例,例如下面我解析接口返回的是
var builder = new ContainerBuilder();
//builder.RegisterType<DataSourceManager>();
builder.RegisterType<Sqlserver>().As<IDataSource>();
using (var container = builder.Build())
{
var manager = container.Resolve<IDataSource>();
Console.WriteLine(manager.GetData());
Console.ReadLine();
}
(3)builder.RegisterType<Object>().Named<Iobject>(string name):为一个接口注册不同的实例.有时候难免会碰到多个类映射同一个接口,比如testa和testb都实现了Itest接口,为了准确获取想要的类型,就必须在注册时起名字。
var builder = new ContainerBuilder();
builder.RegisterType<Sqlserver>().Named<IDataSource>("SqlServer"); builder.RegisterType<Oracle>().Named<IDataSource>("Oracel");
using (var container = builder.Build())
{
var manager = container.ResolveNamed<IDataSource>("Oracel");
Console.WriteLine(manager.GetData());
Console.ReadLine();
}
运行后取得值就是oracle
(4)IContainer.ResolveNamed<IDAL>(string name):解析某个接口的“命名实例”。例如上面的实例最后一行代码
container.ResolveNamed<IDataSource>("Oracel"); 就是解析IDataSource的命名实例Oracel。
(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例.有时候我们会将某一个接口的不同实现用枚举来区分,而不是字符串,例如:
public enum DBType{ Sql, Oracle}
builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);
builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);
OracleDAL oracleDAL = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle);
(6)IContainer.ResolveKeyed<IDAL>(Enum enum):根据枚举值解析某个接口的特定实例.
(7)builder.RegisterType<Worker>().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式
(8)builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例
(9)IContainer.Resolve<T>(NamedParameter namedParameter):在解析实例T时给其赋值,这个就是给你定义的方法的参数传值。
DBManager manager = container.Resolve<DBManager>(new NamedParameter("name", "SQL"));
public class DBManager
{
IDAL dal;
public DBManager (string name,IDAL _dal)
{
Name = name;
dal= _dal;
}
}
3.通过配置的方式使用AutoFac
<configuration>
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler,Autofac.Configuration"></section>
</configSections>
<autofac defaultAssembly="AutoFacDemo">
<components>
<component type="AutoFacDemo.Model.Oracle,AutoFacDemo" service="AutoFacDemo.Model.IDataSource" />
</components>
</autofac>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
后台的调用代码
var builder = new ContainerBuilder();
builder.RegisterType<DataSourceManager>();
builder.RegisterModule(
new ConfigurationSettingsReader("autofac"
));
using (var container = builder.Build())
{
var manager = container.Resolve<DataSourceManager>(new NamedParameter("name", "STONE刘先生"));
Console.WriteLine(manager.GetData());
Console.ReadLine();
}
这里需要注意的是需要引用
Autofac.Configuration.dll,
否则没有办法使用ConfigurationSettingsReader。