【问题标题】:How to run non static method from static inside single class and use dependency injection C#如何从单个类中的静态运行非静态方法并使用依赖注入 C#
【发布时间】:2019-02-07 01:56:51
【问题描述】:

我正在尝试从静态运行非静态方法并在非静态方法中使用依赖注入。 (我试图在一个班级内这样做)

我的代码如下所示:

public class Tokens
{
    private IRefreshTokenRepository refreshTokenRepository;

    public Tokens(IRefreshTokenRepository refreshTokenRepository)
    {
        this.refreshTokenRepository = refreshTokenRepository;
    }

    // I understand that problem is there, but I should to write this
    //constructor because otherwise I can not use class variable in static method 
    public Tokens()
    {
    }


    public static async Task<string> GenerateJwt()
    {
        RefreshToken rf = new RefreshToken{...};

        Tokens t = new Tokens();
        t.StoreRefToken(rf);

        return JsonConvert.SerializeObject(...);
    }


    public async void StoreRefToken(RefreshToken reft)
    {
        this.refreshTokenRepository.InsertRefreshToken(reft);
        await refreshTokenRepository.SaveAsync();
    }


}

正如你从代码中理解的那样,当我写“Tokens t = new Tokens();”时此代码使用了构造函数而没有导入存储库。该怎么办?我可以在单个课程中修复它吗?

谢谢

附:如果问题很愚蠢,我很抱歉

【问题讨论】:

  • 你为什么用java标记?
  • 因为在 Java 依赖注入和“从静态方法运行非静态方法”的工作方式相同,我认为 Java 开发人员可以回答。如果我错了,请说出原因,我会删除标签。
  • 为什么使用静态开头?这似乎是XY problemminimal reproducible example 应该有助于澄清实际问题
  • 谢谢Nkosi,我一定会阅读这篇文章和问题的。

标签: c# asp.net .net oop dependency-injection


【解决方案1】:

静态和依赖注入不能很好地结合在一起。

保持Tokens为实例类并抽象它

public interface ITokenService {
    Task<string> GenerateJwt();
}

这样它就可以作为依赖注入。

从抽象派生Tokens

public class Tokens: ITokensService {
    private readonly IRefreshTokenRepository refreshTokenRepository;

    public Tokens(IRefreshTokenRepository refreshTokenRepository) {
        this.refreshTokenRepository = refreshTokenRepository;
    }

    public async Task<string> GenerateJwt() {
        RefreshToken rf = new RefreshToken{...};

        await StoreRefToken(rf);

        return JsonConvert.SerializeObject(...);
    }

    private async Task StoreRefToken(RefreshToken reft) {
        this.refreshTokenRepository.InsertRefreshToken(reft);
        await refreshTokenRepository.SaveAsync();
    }
}

现在您可以在任何需要它作为依赖项的地方访问所需的成员

【讨论】:

  • 谢谢恩科西。 1个问题:如果我将静态方法设为非静态。代码无论如何都会工作。为什么我需要使用接口?它取决于业务逻辑吗?还是在性能、安全等方面有一些好处?
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多