当前位置:坤哥网-kungge-Autofac学习笔记:在ASP.NET MVC中使用Autofac实现依赖注入

Autofac学习笔记:在ASP.NET MVC中使用Autofac实现依赖注入

2017/11/22 16:33:29 kungge阅读(626) 评论(0)


前面的文章《Autofac学习笔记:通过一个例子学会Autofac基本原理与使用》介绍了Autofac,这篇文章介绍Autofac在ASP.NET MVC中的一种使用方式。


添加Autofac引用


创建一个mvc项目,通过NuGet添加Autofac引用,除此之外还需要添加Autofac针对mvc的引用,项目采用mvc5,所以本次添加Autofac.Mvc5引用,这个库是Autofac对mvc的封装库,引用它我们只需要很少的代码就可以实现依赖注入,通过NuGet找到安装即可:7b11919c-8136-4820-a417-a47960c91942.png

或者通过命令的方式安装:Install-Package Autofac.Mvc5 -Version 4.0.2 

安装完之后,项目中的引用应该包含下面两个:

43d4a6c0-f183-4594-80df-54452d75dce8.png


新增实例相关的类和接口


数据库操作相关的接口和类:

public interface IDBHelper
{
        bool Insert<T>(T t);
}
public class MySqlHelper:IDBHelper
{
        private IValidateData _validate;
        public MySqlHelper(IValidateData validate)
        {
            this._validate = validate;
        }
        public bool Insert<T>(T t)
        {
            if (this._validate.Validate(t))
            {
                Console.WriteLine($"{this.GetType().Name}插入一条记录");
                return true;
            }
            else
            {
                return false;
            }
        }
}
public class SqlServerHelper : IDBHelper
{
        private IValidateData _validate;
        public SqlServerHelper(IValidateData validate)
        {
            this._validate = validate;
        }
        public bool Insert<T>(T t)
        {
            if (this._validate.Validate(t))
            {
                Console.WriteLine($"{this.GetType().Name}插入一条记录");
                return true;
            }
            else
            {
                return false;
            }
        }
}

数据验证相关的接口和类:

public interface IValidateData
{
        bool Validate<T>(T t);
}
public class FirstValidate : IValidateData
{
        public bool Validate<T>(T t)
        {
            Console.WriteLine("第一种验证方式!");
            return true;
        }
}
public class SecondValidate: IValidateData
{
        public bool Validate<T>(T t)
        {
            Console.WriteLine("第二种验证方式!");
            return true;
        }
}


依赖注入实现


为了方便使用,将容器创建过程封装成一个类:

public class DependencyInjector
{
        private static IContainer _container;

        public static IContainer Container
        {
            get { return _container; }
        }

        /// <summary>
        /// 注册相关接口
        /// </summary>
        public static void Initialise()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<SecondValidate>().As<IValidateData>().InstancePerDependency();
            builder.RegisterType<MySqlHelper>().As<IDBHelper>().InstancePerDependency(); 

            _container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(_container));
        }
}

当网站启动的时候注册依赖,因此在全局文件的Application_Start方法中初始化调用DependencyInjector.Initialise():

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    //Autofac注册相关接口
    DependencyInjector.Initialise();
}

新建一个基础控制器BaseController,这样我们需要使用到Autofac注册的接口的Controller继承该Controller即可:

public class BaseController: Controller
{
        /// <summary>
        /// 获取接口
        /// </summary>
        /// <typeparam name="TService"></typeparam>
        /// <returns></returns>
        protected internal TService GetService<TService>()
        {
            return DependencyResolver.Current.GetService<TService>();
        }
}

新建一个控制器AutofacTestController继承BaseController用来测试:

public class AutofacTestController : BaseController
{
        // GET: AutofacTest
        public ActionResult Index()
        {
            var sqlHelper = GetService<IDBHelper>();
            Order order = new Order();
            order.Amount = 5888;
            sqlHelper.Insert(order);

            return View();
        }
}

以上是关于Autofac在MVC中的一个应用,高层模块控制器引用的是IDBHelper抽象接口而不是具体的实现类,具体实现是用那个类由类DependencyInjector决定,该类使用Autofac来注册绑定的,以后要增加相关的数据库或者数据验证方式,直接新增对应的实现了定义的接口的实现类就行,然后再注册绑定。减少了高层对低层的耦合,也做到了开闭原则(对扩展开放,对修改关闭)。

标签: Autofac

发表评论 没有账号,注册评论