AutoFac学习(二)

12 篇文章 1 订阅

上次提到了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。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值