首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ASP.NET核心3.1Web API中配置Autofac DI容器,并从控制器配置使用者服务

在ASP.NET核心3.1Web API中配置Autofac DI容器,并从控制器配置使用者服务
EN

Stack Overflow用户
提问于 2020-07-21 16:05:39
回答 2查看 1.7K关注 0票数 1

我需要在ASP.NET core3.1Web API应用程序中配置Autofac DI容器,并从Web API控制器中的容器调用注册类。我安装了Autofac.Extensions.DependencyInjection (6.0.0)并尝试在我的Startup.cs类中注册容器,但我无法使用服务。另外,是否需要在ConfigureServices(IServiceCollection服务)类中配置容器?调试器在命中点builder.RegisterModule(新的IoCConfigurator() )后不命中IoCConfigurator()类;

Program.cs

代码语言:javascript
复制
public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup();
            });
}

Startup.cs

代码语言:javascript
复制
public class Startup
{
    public IConfiguration Configuration { get; }
    public ContainerBuilder containerBuilder { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        containerBuilder = new ContainerBuilder();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        ServicesConfigurator.Configure(services, Configuration);
        ConfigureIoC(services, containerBuilder);
    }

    public void ConfigureIoC(IServiceCollection services, ContainerBuilder builder)
    {

        builder.RegisterModule(new IoCConfigurator());
    }

IoCConfigurator.cs

代码语言:javascript
复制
public class IoCConfigurator: Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType().As();
        builder.RegisterType().AsSelf();
    }
 }

INotification接口和类

代码语言:javascript
复制
public interface INotificationService
{
   void notifyUsernameChanged(Users users);
}

   public class NotifyService : INotificationService
{
    public void notifyUsernameChanged(Users users)
    {
        string changedUsername = users.Username;

        Console.WriteLine("Username has changed to ... ");
        Console.WriteLine(changedUsername);
    }
}

用户服务类

代码语言:javascript
复制
public class Users
{
    public string Username { get; set; }

    public Users(string username)
    {
        this.Username = username;
    }  
}

public class UsersService
{
    private INotificationService _notificationService;
    public UsersService(INotificationService notificationService)
    {
        this._notificationService = notificationService;
    }

    public void ChangeUsername(Users users, string newUsername)
    {
        users.Username = newUsername;
        _notificationService.notifyUsernameChanged(users);
    }
}

要在其中对UserService类进行类并从DI容器获取引用的API控制器

代码语言:javascript
复制
[Authorize]
[Route("txn/v1/[controller]/[action]")]
[ApiController]
public class DashboardController : ControllerBase
{

  [HttpPost("{name}")]
    public ActionResult GetMessage(string name)
    {
        // call container here...
        var result = new HelloMessage()
        {
            GivenName = name,
            ReturnMessage = "Dashboard@ Hello, Welcome to Texanite Digital"
        };

        return result;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-24 07:28:49

下面是我如何设置它的。在命令行中:

代码语言:javascript
复制
md autof
cd autof
dotnet new webapi
dotnet add package Autofac.Extensions.DependencyInjection

然后使用VS或VSCode进行编辑。Program.cs -正如您所拥有的:

代码语言:javascript
复制
public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup();
            });

接下来,在Startup.cs中,忘记ConfigureIoC,只需注册您想要/需要的服务:

代码语言:javascript
复制
public void ConfigureContainer(ContainerBuilder builder)
    {
        // Register your own things directly with Autofac, like:
        //builder.RegisterModule();
        builder.RegisterType().As();
    }

然后在DashboardController.cs中,您需要从构造函数“注入”所需的服务:

代码语言:javascript
复制
public class HelloMessage {
    public string GivenName { get; set; }
    public string ReturnMessage { get; set; }
}

//[Authorize]   Easier without Auth - don't need
[Route("[controller]")]
[ApiController]
public class DashboardController : ControllerBase
{
    private readonly INotificationService _notifyService;

    public DashboardController(INotificationService notifyService)
    {
        _notifyService = notifyService;
    }

    //[HttpPost("{name}")] - easier to test Get
    [HttpGet("{name}")]
    public ActionResult GetMessage(string name)
    {
        // call container here...
        _notifyService.notifyUsernameChanged(new Users(name));

        var result = new HelloMessage()
        {
            GivenName = name,
            ReturnMessage = $"Dashboard {name}, Welcome to Texanite Digital"
        };

        return result;
    }
}

我的结果:

使用控制台输出:

你的UserService有点“出了圈”,但你可以为它添加一个接口,注册到容器,并将它添加到控制器的注入服务中。

我可以把整件东西都拉上拉链,只是不知道该把它放在哪里还是送去……

票数 3
EN

Stack Overflow用户

发布于 2021-02-24 19:55:18

像这样修改你的代码,这就是我所想的

Program.cs

代码语言:javascript
复制
public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureContainer(builder =>
        {
            builder.RegisterModule(new IoCConfigurator());
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup();
        });
}

Startup.cs

代码语言:javascript
复制
public class Startup
{
public IConfiguration Configuration { get; }
public ContainerBuilder containerBuilder { get; }

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    containerBuilder = new ContainerBuilder();
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63010101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档