Мне нужен совет по рефакторингу кода. У меня есть класс, который содержит несколько зависимостей. Я просто предоставлю конструктор, но этого должно быть достаточно. Класс реализует этот интерфейс:
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"))
У меня есть некоторые опасения, что я могу сделать это лучше. Не могли бы вы дать мне подсказку, как сделать этот подход более чистым, если это возможно?