Как улучшить фабричный подход, чтобы правильно регистрировать зависимости - PullRequest
0 голосов
/ 24 января 2020

Мне нужен совет по рефакторингу кода. У меня есть класс, который содержит несколько зависимостей. Я просто предоставлю конструктор, но этого должно быть достаточно. Класс реализует этот интерфейс:

public interface ITopicPublisher<T> {} 

и сам класс:

public class TopicPublisher<T> : ITopicPublisher<T>
{
    public TopicPublisher(IEventGridClient eventGridClient, string topicEndpoint) { ... }
}

Теперь экземпляр этого класса внедряется в контроллеры следующим образом:

public class SomeController : Controller
{
     public SomeController(ITopicPublisher<MyEntity> publisher) { ... }
}

чтобы создать EventGridClient, мне нужно построить его следующим образом (где ключ - простая строка):

new EventGridClient(new TopicCredentials(key))

Теперь topicEndpoint и key взяты из Environment.GetEnvironmentVariable (... ). Все это теперь проблематично c при регистрации зависимостей в ASP. NET (2.2) Startup.cs.

builder.Services
    .AddScoped(x => new TopicPublisher<MyEntity>(new EventGridClient(
        new TopicCredentials(Environment.GetEnvironmentVariable("KEY"))),
        Environment.GetEnvironmentVariable("ENDPOINT")))

Мне не понравилось, поэтому я создал фабрику, например:

public class EnvironmentVariableTopicPublisherFactory
{
    public static ITopicPublisher<T> Create<T>(string topicUrlEnvironmentVariable, string keyEnvironmentVariable) where T : class =>
        new TopicPublisher<T>(new EventGridClient(new TopicCredentials(Environment.GetEnvironmentVariable(keyEnvironmentVariable))), 
            Environment.GetEnvironmentVariable(topicUrlEnvironmentVariable));
}

, и теперь процесс регистрации выглядит немного проще:

builder.Services
    .AddScoped(x => EnvironmentVariableTopicPublisherFactory.Create<MyEntity>("ENDPOINT", "KEY"))

У меня есть некоторые опасения, что я могу сделать это лучше. Не могли бы вы дать мне подсказку, как сделать этот подход более чистым, если это возможно?

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