C# 如何将值传递给另一个程序集中类的构造函数
我正在使用具有以下定义的程序集中的服务:C# 如何将值传递给另一个程序集中类的构造函数,c#,factory-pattern,C#,Factory Pattern,我正在使用具有以下定义的程序集中的服务: internal class BinanceService : IBinanceService { private readonly IBinanceClient _binanceClient; public BinanceService(IBinanceClient binanceClient) { _binanceClient = binanceClient;
internal class BinanceService : IBinanceService
{
private readonly IBinanceClient _binanceClient;
public BinanceService(IBinanceClient binanceClient)
{
_binanceClient = binanceClient;
_binanceClient.SetApiCredentials("u4TX2adUAkpCyRDrStohFNf5otSlw7S7W077X9BQ7KGQbC7C2Y", "uxadyxYyMRPF3caQM0pbzT5naEA9BntqFREJRNIQIBxHNyS");
}
}
上面的代码存在于程序集B中引用过的程序集(我们称之为A)中。现在,我想在从程序集B调用IBianceService时为SetApiCredentials(“,”)传递不同的参数。我该如何做??
谢谢,因为类被标记为内部类,所以它不会暴露于引用程序集。您要么需要将其公开,要么如果不可能,将其作为好友程序集
请参见:因为类被标记为内部类,所以它不会暴露于引用程序集。您要么需要将其公开,要么如果不可能,将其作为好友程序集
请参见:您的类是内部的,这意味着从程序集内部,您可以通过构造函数正常创建它。将凭据也放在构造函数中,您可以任意选择它们:
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);
}
}
您的类是内部的,这意味着您可以从程序集内部通过构造函数正常创建它。将凭据也放在构造函数中,您可以任意选择它们:
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);
}
}
这是一个长期目标,但如果这是关于依赖注入的,这是我使用的一种模式:
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,只接受已设置的客户端。这是一个很长的选择,但如果这是关于依赖项注入的,这是我使用的一种模式:
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,只接受已设置的客户端。该方法看起来是静态的。它可能位于不同的名称空间中,因此您误解了名称空间。所以,如果名称空间是Application2,您可以使用:Application2._binanceClient.SetApiCredentials(“u4TX2adUAkpCyRDrStohFNf5otSlw7S7W077X9BQ7KGQbC7C2Y”,“uxadyxyymrpf3caqm0pbzt5naea9bntqfriqibxhnys”);您可以更改两个程序集中的代码吗?根据实际创建的
BinanceService
实例的位置,您需要能够通过公开该类来访问该类。这是用于依赖项注入吗?该方法看起来是静态的。它可能位于不同的名称空间中,因此您误解了名称空间。所以,如果名称空间是Application2,您可以使用:Application2._binanceClient.SetApiCredentials(“u4TX2adUAkpCyRDrStohFNf5otSlw7S7W077X9BQ7KGQbC7C2Y”,“uxadyxyymrpf3caqm0pbzt5naea9bntqfriqibxhnys”);您可以更改两个程序集中的代码吗?根据实际创建BinanceService
实例的位置,您需要能够通过公开该类来访问该类。这是用于依赖项注入的吗?谢谢您的回答,最好的解决方案是工厂。在您的解决方案中,当我在另一个程序集中使用IBianceService时使用构造函数注入时,我应该如何使用BinanceServiceFactory?问题是,只有第二个程序集可以访问凭据变量,它们应该从调用程序集(程序集B)馈送。@Ehsan:在这种情况下,还可以将其作为参数添加到工厂中。如果从程序集B调用它,则可以提供凭据。我以为你想强制执行不同的凭据。谢谢你的回答,最好的解决方案是工厂。在您的解决方案中,当我在另一个程序集中使用IBianceService时使用构造函数注入时,我应该如何使用BinanceServiceFactory?问题是,只有第二个程序集可以访问凭据变量,它们应该从调用程序集(程序集B)馈送。@Ehsan:在这种情况下,还可以将其作为参数添加到工厂中。如果从程序集B调用它,则可以提供凭据。我以为你想强制执行不同的凭证。