-1

我正在开发一个 Web 应用程序(.net core 5)并尝试替换单例依赖项。我知道,可以在Startup.cs中替换依赖项

(ConfigureServices(IServiceCollection services) method)

. 但问题是我无法访问控制器中的“IServiceCollection”。你们知道如何实现它吗?

似乎这项工作用于替换依赖项,但问题是我无法访问控制器中的服务: Replace service registration in ASP.NET Core built-in DI container?

我把它变红了,但答案不起作用: .NET Core - 改变控制器中的依赖关系

更新 :

场景:我正在使用InstaSharper开发一个 insta API 应用程序, 第一次用户想要使用这个 Web 应用程序时,我的 instaAPI 服务实现存储了这个服务的空用户名和密码。现在用户将添加 Instagram 用户名和密码。现在我需要重置 instaAPI 服务并设置新的用户名和密码。每次用户更新他/她的用户名或密码时都会发生这种情况。

4

1 回答 1

0

与其他现代 DI 容器(例如 Autofac 和 Simple Injector)一样,一旦应用程序启动,就不可能更改容器的配置。例如,在不同 DI 容器的文档的本节中解释了在应用程序运行时能够更改配置的问题和风险。

然而,这些限制确实迫使您采取不同的方法。可能有多种解决方案,但大多数解决方案在概念上都归结为同一件事,即:不要替换组件,而是更新该组件的状态。

这是一个例子:

凭据的数据容器:

// This data structure is immutable.
public sealed class InstaCredentials
{
    public string UserName { get; }
    public string Password { get; }

    public InstaCredentials(string userName, string password)
    {
        this.UserName = userName;
        this.Password = password;
    }
}

Insta 服务的抽象:

public interface IInstaService
{
    // Method to apply credentials coming from the user
    void SetCredentials(InstaCredentials credentials);
}

使用 IInstaService 的控制器:

public sealed class HomeController
{
    private readonly IInstaService instaService;

    public HomeController(IInstaService instaService)
    {
        this.instaService = instaService;
    }

    public void LogIn(LogInModel model)
    {
        // Apply credentials
        var credentials = new InstaCredentials(model.UserName, model.Password);
        this.instaService.SetCredentials(credentials);
    }
}

Insta服务实现:

public sealed class InstaServiceIMpl : IInstaService
{
    private InstaCredentials credentials = new InstaCredentials(null, null);

    public void SetCredentials(InstaCredentials credentials)
    {
        this.credentials = credentials ?? throw new ArgumentNullException(nameof(credentials));
    }
}
于 2020-12-30T11:36:09.027 回答