雪花

.Net FrameWork的IOC

一、

1、创建项目

 选择空模板以及MVC引用

 2、添加Api控制器,并配置可访问

3、IOC配置

using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Http;
using Autofac.Integration.WebApi;

namespace IOCDemo
{
    public class MvcApplication : System.Web.HttpApplication
    {
        #region 注入
        //这里一定要注意,首先依赖关系接口一定要设置为静态的,并且是public。不然用到的时候无法调用。
        public static IContainer container { get; set; }
        public void Dependency()
        {

            var builder = new ContainerBuilder();
            /* 1、注册
             * RegisterGeneric:注册非参数化泛型类型:RegisterGeneric(typeof(类)).As(typeof(接口))
             * RegisterType:通过RegisterType<类>.As<接口>() 来注册不是泛型的类
             */
            builder.RegisterType<TestService>().As<ITestService>();
            /* 2、获取接口类型
             * 通过IDependency标记需要依赖注入的接口
             * 注册所有实现了IDependency接口的类型
             */
            Type baseType = typeof(ITestService);


            /* 3、获取所有程序集
             * 当CLR COM服务器初始化时,它会创建一个AppDomain。 AppDomain是一组程序集的逻辑容器
             */
            //var assemblies = AppDomain.CurrentDomain.GetAssemblies();//这种写法AppDomain重新启动后会丢失程序集
            var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();

            /* 4、自动注册接口
             * 筛选出对应条件的接口
             * IsAssignableFrom:返回true的条件:是否直接或间接实现了IDependency
             * IsAbstract:是否为抽象类
             * AsImplementedInterfaces:以接口的形式注册
             * InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例
             */
            builder.RegisterAssemblyTypes(assemblies)
                .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract).AsImplementedInterfaces().InstancePerLifetimeScope();

            /*5、自动注册MVC与api控制器
             */
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            IContainer container = builder.Build();

            /*6、ApiController WebApi注入
             */
            var webapiresolver = new AutofacWebApiDependencyResolver(container);
            GlobalConfiguration.Configuration.DependencyResolver = webapiresolver;

            /*7、mvc注入
            */
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


        }
        #endregion
        protected void Application_Start()
        {
            Dependency();

            GlobalConfiguration.Configure(WebApiConfig.Register);
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

访问:

 

 注意:依赖包:

 mvc的

 

 

 

 注册Controller
注册当前程序集下的所有Controller

builder.RegisterControllers(typeof(MvcApplication).Assembly);
注册单个Controller

builder.RegisterType<HomeController>().InstancePerRequest();

 

 

 

posted @ 2020-01-02 10:53  十色  阅读(744)  评论(0编辑  收藏  举报