Как реализовать возврат переменных из классов, используя инверсию зависимостей?

Как можно вернуть переменные из классов, реализующих интерфейсы в C#? В приведенном коде используются интерфейсы `IAuthorizations` и `IAuthorizationTokens`, которые реализованы классом `Authorizations`. Каким образом можно получить доступ к переменным из класса, реализующего эти интерфейсы? Кроме того, какие преимущества могут быть при работе с такой структурой классов и интерфейсов?
  • 29 апреля 2024 г. 15:10
Ответы на вопрос 2
Для возврата переменных из класса, реализующего интерфейс, можно добавить методы в интерфейс, которые будут возвращать нужные переменные. После этого в классе, который реализует этот интерфейс, нужно реализовать эти методы и вернуть значения переменных.

Пример:

```csharp
public interface IAuthorizations
{
    bool IsAuthorized();
}

public interface IAuthorizationTokens
{
    string GetToken();
}

public class Authorizations : IAuthorizations, IAuthorizationTokens
{
    private bool authorized = true;
    private string token = "abc123";

    public bool IsAuthorized()
    {
        return authorized;
    }

    public string GetToken()
    {
        return token;
    }
}
```

Чтобы получить доступ к переменным из класса `Authorizations`, можно создать экземпляр этого класса и через интерфейсы вызвать методы, которые возвращают нужные переменные:

```csharp
Authorizations authorizations = new Authorizations();
bool isAuthorized = authorizations.IsAuthorized();
string token = authorizations.GetToken();
```

Преимущества работы с такой структурой классов и интерфейсов включают в себя удобство взаимодействия с различными классами, которые реализуют эти интерфейсы. Это позволяет легко заменять один класс другим, не изменяя код, который использует эти классы через интерфейсы. Также такой подход способствует соблюдению принципа инверсии зависимостей и повышает гибкость и расширяемость кода.
internal class Authorizations : IAuthorizations, IAuthorizationTokens
    {
        public string Access_token_Vk { set; get; }
        public string Version_VkAPI { set; get; }
        public string? Token_Telegram { set; get; }
        public List<string> IdTelegram { set; get; } = new List<string>();

        public Controller Controller { set; get; }
        public void Authorization(Controller controller)
        {
            Controller  = controller;
            var log = Log.ForContext<Authorizations>();

            try
            {
                var config = new ConfigurationBuilder()
                    .AddJsonFile("Properties/secretKey.json")
                    .Build();
                Access_token_Vk = config.GetValue<string>("VCSecret:access_token");
                Version_VkAPI = config.GetValue<string>("VCSecret:version");
                Token_Telegram = config.GetValue<string>("TelegramSecret:token");
                IdTelegram.Add(config.GetValue<string>("TelegramId:id_1"));
                IdTelegram.Add(config.GetValue<string>("TelegramId:id_2"));
            }
            catch (Exception ex)
            {
                log.Error("Конфигурационный файл не доступен", ex);
            }

            log.Information(Access_token_Vk);
            log.Information(Version_VkAPI);
            log.Information(Token_Telegram);

            foreach (var id in IdTelegram)
            {
                log.Information($"{id}");
            }
            controller.Test("Твои данные");
        }
    }

internal class Controller
    {
        public async Task RunController()
        {
            var log = Log.ForContext<Controller>();
            log.Information("Start");

            AuthorizationController authorizationController=new AuthorizationController(new Authorizations(this));
            authorizationController.Authorization();

            log.Information("Token finded: ");
        }
      public void Test()
     {
     }
    }


Похожие вопросы