首页 > 编程语言 >C# autofac 在Net6中的使用

C# autofac 在Net6中的使用

时间:2023-03-26 11:04:58浏览次数:44  
标签:autofac C# IAnimal dog say Net6 containerBuilder cat public

十年河东,十年河西,莫欺少年穷。

学无止境,精益求精。

准备如下工作:

新建一个Net6  webApi项目,并在该项目中引入:

C# autofac 在Net6中的使用_多继承

 

 新建类库MyInterface 和 MyService,项目构造如下

C# autofac 在Net6中的使用_多继承_02

 

 接口如下:

/// <summary>
    /// 动物接口
    /// </summary>
    public interface IAnimal
    {
        void say(); 
    }

实现类如下:

namespace MyService
{ 

    public class DogService : IAnimal
    {
        public void say()
        {
            Console.WriteLine("汪汪汪");
        }
    }

    public class CatService : IAnimal
    {
        public void say()
        {
            Console.WriteLine("喵喵喵");
        }
    }

    public class PigService : IAnimal
    {
        public void say()
        {
            Console.WriteLine("哼哼哼");
        }
    }
     
}

View Code

1、在webApi中引入autofac,并进行接口和实现类注入

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    containerBuilder.RegisterType<DogService>().As<IAnimal>();
    containerBuilder.RegisterType<CatService>().As<IAnimal>();
    containerBuilder.RegisterType<PigService>().As<IAnimal>();
});

View Code

C# autofac 在Net6中的使用_ide_03

 

 2、在控制器中通过构造函数注入

namespace WebAppAutofac.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IAnimal Animal;
        private readonly IEnumerable<IAnimal> Animals; 

        public HomeController( IAnimal animal, IEnumerable<IAnimal> animals,IServiceProvider provider,IComponentContext context)
        {
            Animal = animal;
            Animals = animals;
            //
            var MyAnimal_1 = provider.GetService<IAnimal>();
            var MyAnimal_2 = context.Resolve<IAnimal>();
            //// 
        }

        [HttpGet]
        public ActionResult get()
        {
            Animal.say();
            Console.WriteLine($"实现类的个数为:" + Animals.Count());
            
            return Ok();
        }
    }
}

3、单抽象多继承的处理

项目中,动物接口由猫、狗、猪三个实现类继承,因此,上述代码构建的对象时最后一个注入的实现类对象,因此,我们有必要对单抽象多继承进行处理

关于单抽象多继承问题,可参考上篇博客:C# Autofac 构造函数注入,属性注入,方法注入

修改Program.cs注册autofac方法如下:

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    containerBuilder.RegisterType<DogService>().Keyed<IAnimal>("dog");
    containerBuilder.RegisterType<CatService>().Keyed<IAnimal>("cat");
    containerBuilder.RegisterType<PigService>().Keyed<IAnimal>("pig"); 
});

控制器注入如下:

using Autofac;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MyInterface;

namespace WebAppAutofac.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        //
        private readonly IAnimal dog;
        private readonly IAnimal cat;
        private readonly IAnimal pig;

        public HomeController(IServiceProvider provider,IComponentContext context)
        { 
            //
            var s = provider.GetService<IAnimal>();
            ////
            dog = context.ResolveKeyed<IAnimal>("dog");
            cat = context.ResolveKeyed<IAnimal>("cat");
            pig = context.ResolveKeyed<IAnimal>("pig");
        }

        [HttpGet]
        public ActionResult get()
        { 
            dog.say();
            cat.say();
            pig.say();
            return Ok();
        }
    }
}

4、属性注入

由于本案例采用的是单抽象多继承,因此代码直接使用Keyed标识

修改Program.cs注册autofac方法如下

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{ 
    containerBuilder.RegisterType<DogService>().Keyed<IAnimal>("dog");
    containerBuilder.RegisterType<CatService>().Keyed<IAnimal>("cat");
    containerBuilder.RegisterType<PigService>().Keyed<IAnimal>("pig");
    //使继承自ControllerBase的控制器支持属性注入且排除掉ControllerBase自己
    var ControllerBaseType = typeof(ControllerBase);
    containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(A => ControllerBaseType.IsAssignableFrom(A) && A != ControllerBaseType).PropertiesAutowired();
});

//修改微软默认设置
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

注意红色的两段代码

C# autofac 在Net6中的使用_ide_04

 

 控制器代码如下:

using Autofac;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MyInterface;

namespace WebAppAutofac.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        //
        public IAnimal dog { get; set; }
        public  IAnimal cat { get; set; }
        public IAnimal pig { get; set; }

        public HomeController(IServiceProvider provider, IComponentContext context)
        {
            //dog = provider.GetService<IAnimal>();
            dog = context.ResolveKeyed<IAnimal>("dog");
            cat = context.ResolveKeyed<IAnimal>("cat");
            pig = context.ResolveKeyed<IAnimal>("pig");
        }

        [HttpGet]
        public ActionResult get()
        { 
            dog.say();
            cat.say();
            pig.say();
            return Ok();
        }
    }
}

over

@陈大六的波尔卡

 



标签:autofac,C#,IAnimal,dog,say,Net6,containerBuilder,cat,public
From: https://blog.51cto.com/u_15316082/6149926

相关文章

  • C# Autofac 构造函数注入,属性注入,方法注入
    十年河东,十年河西,莫欺少年穷。学无止境,精益求精。新建一个控制台应用程序,如下构造: MyAutoFac层引入autofac版本V6.5接口层如下:namespaceMyInterface{publicinter......
  • C# Autofac简单用法
    十年河东,十年河西,莫欺少年穷学无止境,精益求精新建一个控制台程序,如下 MyAutoFac项目引用NugetautofacV6.5版本新建如下接口:publicinterface动物{void......
  • 解决mac升级之后不可以ssh
    很多同学更新系统之后,使用这两者都会遇到一条报错,类似于:SSH(ssh:connecttohostlocalhostport22:Connectionrefused)我们之前出过一篇文章但是现在也不好用了怎......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。1、java新建类HelloWorld,并声明native方法,引入hello的dllpublicclassHel......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。1、java新建类HelloWorld,并声明native方法,引入hello的dllpublicclassHel......
  • C++指针
    1指针的概念#include<iostream>usingnamespacestd;/*间接引用指针时,可获得该指针指向的变量内容本部分参考内容:C++程序设计教程钱能清华大学出版社*/void......
  • Above-the-Fold Loading 加载机制在 Spartacus Storefront 里的应用
    Angular应用默认情况下,Component组件总是被积极渲染,不管组件是否在用户的viewports中。这可能对性能带来负面影响,但可以通过评估视口与组件来进行优化——Viewports......
  • 五个实用的docker小工具
    在使用docker的过程中,除了dockerpull、dockerpush等常见命令外,还有一些实用的小工具帮助更好地使用docker,如:rekcodrunlikeget_command_4_run_containerwhalerdiver......
  • python基础:split、join、replace、remove、del、pop、index小记python 字符串的split(
    这里总结了平时写脚本时经常用到的一些基础方法,做个记录1、split()函数可以基于分隔符将字符串分割成由若干子串组成的列表str.split(str="",num=string.count(str))str......
  • 本地构建和发布 Spartacus libraries 所需要的两个工具
    详细步骤参考这篇文档。本文介绍了如何检查Spartacus源代码、在本地构建库,然后使它们可供安装。这允许开发人员使用已编译的Spartacus库,因此不再需要从npm存储库访......