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调用它,则可以提供凭据。我以为你想强制执行不同的凭证。