AutoFac依赖注入框架

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。

官方网站http://autofac.org/

源码下载地址https://github.com/autofac/Autofac

控制反转和依赖注入

关于控制反转和依赖注入的文章和书籍很多,对其定义也解释的也仁者见仁,这里就不赘述了,这是本人(只代表个人观点)的理解:

  • 控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
  • 依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。

安装Autofac

1.install -package Autofac

2.如果和hangfire一起使用,则安装hangfire.autofac包。

autofac.cs

using Autofac;
using Hangfire;
using scheduleJob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RecurHangfire
{
    public class Autofac
    {
        public static IContainer Container { get; set; }

        public Autofac()
        { }

        public static void Register()
        {
            var builder = new ContainerBuilder();
            //register
            builder.RegisterType<Schedule>().As<ISchedule>().InstancePerLifetimeScope();     //注册type class为 interface 其创建实例的方法。
            Container = builder.Build();
            GlobalConfiguration.Configuration.UseAutofacActivator(Container);    //Hangfire autofac
        }
    }
}

 schedule.cs

public interface ISchedule:IDependency
    {
        Task<int> AccessTheWebAsync();
        void DoIndependentWork(string urlContent);
        void WriteLog(string msg);
    }

public class Schedule: ISchedule
{

   //实现类方法。

}

 被调用的地方。

 private ISchedule schedule;

        public HangfireController(ISchedule schedule)
        {
            this.schedule = schedule;
        }

 RecurringJob.AddOrUpdate(() => schedule.WriteLog("每分钟执行任务"), Cron.Minutely);     //类似static类方法,不需要实例,而是autofac在做这件事。

  

 

创建实例方法

1、InstancePerDependency

对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。

官方文档解释:Configure the component so that every dependent component or call to Resolve() gets a new, unique instance (default.)

2、InstancePerLifetimeScope

在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。

官方文档解释:Configure the component so that every dependent component or call to Resolve() within a single ILifetimeScope gets the same, shared instance. Dependent components in different lifetime scopes will get different instances.

3、InstancePerMatchingLifetimeScope

在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。

官方文档解释:Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope tagged with any of the provided tags value gets the same, shared instance. Dependent components in lifetime scopes that are children of the tagged scope will share the parent's instance. If no appropriately tagged scope can be found in the hierarchy an DependencyResolutionException is thrown.

4、InstancePerOwned

在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。

官方文档解释:

Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope created by an owned instance gets the same, shared instance. Dependent components in lifetime scopes that are children of the owned instance scope will share the parent's instance. If no appropriate owned instance scope can be found in the hierarchy an DependencyResolutionException is thrown.

5、SingleInstance

每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。

官方文档解释:Configure the component so that every dependent component or call to Resolve() gets the same, shared instance.

6、InstancePerHttpRequest

在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。

参考链接:

autofac 创建实例方法总结:http://www.cnblogs.com/manglu/p/4115128.html

AutoFac使用方法总结:Part I:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/

官方网站http://autofac.org/

源码下载地址https://github.com/autofac/Autofac

控制反转和依赖注入

关于控制反转和依赖注入的文章和书籍很多,对其定义也解释的也仁者见仁,这里就不赘述了,这是本人(只代表个人观点)的理解:

  • 控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
  • 依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。

安装Autofac

1.install -package Autofac

2.如果和hangfire一起使用,则安装hangfire.autofac包。

autofac.cs

using Autofac;
using Hangfire;
using scheduleJob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RecurHangfire
{
    public class Autofac
    {
        public static IContainer Container { get; set; }

        public Autofac()
        { }

        public static void Register()
        {
            var builder = new ContainerBuilder();
            //register
            builder.RegisterType<Schedule>().As<ISchedule>().InstancePerLifetimeScope();     //注册type class为 interface 其创建实例的方法。
            Container = builder.Build();
            GlobalConfiguration.Configuration.UseAutofacActivator(Container);    //Hangfire autofac
        }
    }
}

 schedule.cs

public interface ISchedule:IDependency
    {
        Task<int> AccessTheWebAsync();
        void DoIndependentWork(string urlContent);
        void WriteLog(string msg);
    }

public class Schedule: ISchedule
{

   //实现类方法。

}

 被调用的地方。

 private ISchedule schedule;

        public HangfireController(ISchedule schedule)
        {
            this.schedule = schedule;
        }

 RecurringJob.AddOrUpdate(() => schedule.WriteLog("每分钟执行任务"), Cron.Minutely);     //类似static类方法,不需要实例,而是autofac在做这件事。

  

 

创建实例方法

1、InstancePerDependency

对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。

官方文档解释:Configure the component so that every dependent component or call to Resolve() gets a new, unique instance (default.)

2、InstancePerLifetimeScope

在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。

官方文档解释:Configure the component so that every dependent component or call to Resolve() within a single ILifetimeScope gets the same, shared instance. Dependent components in different lifetime scopes will get different instances.

3、InstancePerMatchingLifetimeScope

在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。

官方文档解释:Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope tagged with any of the provided tags value gets the same, shared instance. Dependent components in lifetime scopes that are children of the tagged scope will share the parent's instance. If no appropriately tagged scope can be found in the hierarchy an DependencyResolutionException is thrown.

4、InstancePerOwned

在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。

官方文档解释:

Configure the component so that every dependent component or call to Resolve() within a ILifetimeScope created by an owned instance gets the same, shared instance. Dependent components in lifetime scopes that are children of the owned instance scope will share the parent's instance. If no appropriate owned instance scope can be found in the hierarchy an DependencyResolutionException is thrown.

5、SingleInstance

每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。

官方文档解释:Configure the component so that every dependent component or call to Resolve() gets the same, shared instance.

6、InstancePerHttpRequest

在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。

参考链接:

autofac 创建实例方法总结:http://www.cnblogs.com/manglu/p/4115128.html

AutoFac使用方法总结:Part I:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/

猜你喜欢

转载自www.cnblogs.com/xxh-2014/p/9264683.html