#c# #factory-pattern
Вопрос:
Я использую службу в сборке со следующим определением:
internal class BinanceService : IBinanceService
{
private readonly IBinanceClient _binanceClient;
public BinanceService(IBinanceClient binanceClient)
{
_binanceClient = binanceClient;
_binanceClient.SetApiCredentials("u4TX2adUAkpCyRDrStohFNf5otSlw7S7W077X9BQ7KGQbC7C2Y", "uxadyxYyMRPF3caQM0pbzT5naEA9BntqFREJRNIQIBxHNyS");
}
}
приведенный выше код находится в сборке (назовем ее A), на которую была сделана ссылка в сборке B. Теперь я хочу передать различные параметры для SetApiCredentials(«»,»») при вызове IBinanceService из сборки B. Как я могу это сделать??
Спасибо
Комментарии:
1. Похоже, что метод статичен. Вероятно, он находится в другом пространстве имен, поэтому вы вводите пространство имен в заблуждение. Поэтому, если пространство имен Application2, вы используете : Application2._binanceClient. Набор параметров(«u4TX2adUAkpCyRDrStohFNf5otSlw7S7W077X9BQ7KGQbC7C2Y», «uxadyxYyMRPF3caQM0pbzT5naEA9BntqFREJRNIQIBxHNyS»);
2. Можете ли вы изменить код в обеих сборках?
3. В зависимости от того, где вы на самом деле создаете экземпляр
BinanceService
, вам необходимо иметь доступ к этому классу, сделав его общедоступным.4. Это для инъекции зависимостей?
Ответ №1:
Ваш класс является внутренним, это означает, что внутри сборки вы можете создать его обычным способом с помощью конструктора. Поместите учетные данные также в конструктор, и вы можете выбрать их произвольно:
internal class BinanceService : IBinanceService
{
private readonly IBinanceClient _binanceClient;
public BinanceService(IBinanceClient binanceClient, string credentials)
{
_binanceClient = binanceClient;
_binanceClient.SetApiCredentials(credentials);
}
}
Извне вы не сможете получить доступ к классу. Создайте фабрику, которая возвращает экземпляр IBinanceService
(я предполагаю, что интерфейс является общедоступным). Вызывающий абонент не должен иметь возможности передавать свою собственную строку учетных данных. Следовательно, при вызове этого метода externalCredentials
будут использоваться только учетные данные, сохраненные в константе.
public static class BinanceServiceFactory()
{
private const string externalCredentials = "something";
public static IBinanceService Create(IBinanceClient client)
{
return new BinanceService(client, externalCredentials);
}
}
Комментарии:
1. спасибо за ваш ответ, лучшее решение для этого-завод. в вашем решении, как я должен использовать BinanceServiceFactory, поскольку я использую инъекцию конструктора при использовании IBinanceService в другой сборке?
2. Проблема в том, что только вторая сборка имеет доступ к переменным учетных данных, и они должны передаваться из вызывающей сборки(сборка B).
3. @Ehsan: В таком случае добавьте его также в качестве параметра на фабрику. Если вы вызовете его из сборки B, вы можете предоставить учетные данные. Я думал, что вы хотите применить другие учетные данные.
Ответ №2:
Это рискованно, но если речь идет о внедрении зависимостей, то я использовал этот шаблон:
public class XCredentialsProvider
{
public string ClientId {get;set;}
public string Secret {get;set;
// Constructor here
}
(...)
public BinanceService(IBinanceClient binanceClient, XCredentialsProvider credentialsProvider)
{
_binanceClient = binanceClient;
_binanceClient.SetApiCredentials(credentialsProvider.ClientId, credentialsProvider.Secret);
}
Затем в конфигурации Unity:
container.RegisterInstance(new XCredentialsProvider(clientId: ..., secret: ...));
Другой вариант-не вызывать SetApiCredentials и просто принять настроенного клиента.
Ответ №3:
Поскольку класс помечен как внутренний, он не подвергается ссылкам на сборку. Вам либо нужно сделать его общедоступным, либо, если это невозможно, сделайте его собранием друзей.
Смотрите это: Сборка друзей в .NET