Как запустить нестатический метод из статического внутри одного класса и использовать внедрение зависимостей C # - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь запустить нестатический метод из статического и использовать инъекцию зависимостей внутри нестатического метода. (Я пытаюсь сделать это в одном классе)

Мой код выглядит так:

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 ();" этот код использовал конструктор без импорта репозитория. Что делать? Могу ли я исправить это в одном классе?

Спасибо

P.S. если вопрос глуп, извини

1 Ответ

0 голосов
/ 01 сентября 2018

Static и Dependency Injection плохо сочетаются друг с другом.

Сохранить 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();
    }
}

Теперь у вас есть доступ к нужным членам, где это необходимо в качестве зависимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...