• Autofac IOC框架


    ASP.NET Core自带了一个轻量级的IOC容器     但是只提供了最基本的AddXXX方法来绑定实例关系     需要一个一个添加   可以使用其他IOC容器来替换内置的

     ABP自带Castle容器

    1.安装Nuget包 Autofac 和 Autofac.Extensions.DependencyInjection

    2.使用Autofac替换自带的IOC容器

    在Startup.cs中如果ConfigureServices方法返回类型是void  改成IServiceProvider

    先定义一个容器        public Autofac.IContainer ApplicationContainer { get; private set; }

                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
                //实例化Autofac容器
                var builder = new ContainerBuilder();
                //将Services中的服务填充到Autofac中
                builder.Populate(services);
                //新模块组件注册    
                builder.RegisterModule<AutofacModuleRegister>();
                //创建容器接收
                var Container = builder.Build();
                //这里可以不需要在上面定义ApplicationContainer  这句代码可以不要
                //this.ApplicationContainer = Container;
                //第三方IOC接管 core内置DI容器 
                return new AutofacServiceProvider(Container);

    AutofacModuleRegister.cs

        public class AutofacModuleRegister : Autofac.Module
        {
            //重写Autofac管道Load方法,在这里注册注入
            protected override void Load(ContainerBuilder builder)
            {
                //找到AutofacMvcDemo程序集中,以Service结尾的类,找到满足的类和实现的接口自动进行注册
                builder.RegisterAssemblyTypes(GetAssemblyByName("JcbApplication")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
                //找到Program类型所在的程序集,以Repository结尾的类,找到满足的类和实现的接口自动进行注册
                builder.RegisterAssemblyTypes(GetAssemblyByName("JcbApplication")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();
    
                //某个接口有多个实现类 需要特殊的进行手动注册 最后一个参数就是标识  字符串
                builder.RegisterType<SqlService>().Named<ISqlService>(typeof(SqlService).Name);
                builder.RegisterType<MySqlService>().Named<ISqlService>(typeof(MySqlService).Name);
    
            }
            /// <summary>
            /// 根据程序集名称获取程序集
            /// </summary>
            /// <param name="AssemblyName">程序集名称</param>
            /// <returns></returns>
            public static Assembly GetAssemblyByName(String AssemblyName)
            {
                return Assembly.Load(AssemblyName);
            }
        }

    3.当一个接口有多个实例    使用的时候需要指定

        public class HomeController : Controller
        {
            private IPersonService _personService;
            private ISqlService _sqlService;
            private ISqlService _mysqlService;
            private IComponentContext _componentContext;//Autofac上下文
            public HomeController(IPersonService personService, IComponentContext componentContext)
            {
                this._personService = personService;
                this._componentContext = componentContext;
                this._sqlService = _componentContext.ResolveNamed<ISqlService>(typeof(SqlService).Name);
                this._mysqlService = _componentContext.ResolveNamed<ISqlService>(typeof(MySqlService).Name);
            }
            public IActionResult Index()
            {
                var aa = _personService.GetData();
                var bb = _sqlService.GetData();
                var cc = _mysqlService.GetData();
                return View();
            }

    多种不同的注册方式

    https://www.cnblogs.com/bluesummer/p/8875702.html

    //注册同一接口的多个实例

    https://www.cnblogs.com/wei325/p/9191686.html

  • 相关阅读:
    SQL 使用identity(int,1,1)来产生行号。
    SQL DateName\DatePart 返回表示指定date的指定datepart的字符串
    让我们受用一生的好习惯
    SCRUM软件开发过程(转)
    计算机英语词汇
    oral English英语绕口令(转)
    Setup相关经验总结
    与老外吵架之必会109句
    BAT批处理文件语法(转)
    SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
  • 原文地址:https://www.cnblogs.com/jiangchengbiao/p/10449747.html
Copyright © 2020-2023  润新知