C# 简单注入器有条件地向委托注册

C# 简单注入器有条件地向委托注册,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我正在编写一个应用程序,它使用以下接口定义的类: public interface ICredentialProvider { string GetUsername(); string GetPassword(); } 这样做是为了调用方法来检索用户名/密码,而不是将其静态保存在内存中并在代码/配置文件中定义 目前正在开发中,我正在使用这个非常简单的实现: public class FakedCredentialProvider : ICredentialProvider {

我正在编写一个应用程序,它使用以下接口定义的类:

public interface ICredentialProvider
{
    string GetUsername();
    string GetPassword();
}
这样做是为了调用方法来检索用户名/密码,而不是将其静态保存在内存中并在代码/配置文件中定义

目前正在开发中,我正在使用这个非常简单的实现:

public class FakedCredentialProvider : ICredentialProvider
{
    private readonly string _username;
    private readonly string _password;

    public FakedCredentialProvider(string username, string password)
    {
        _username = username;
        _password = password;
    }

    public string GetUsername()
    {
        return _username;
    }

    public string GetPassword()
    {
        return _password;
    }
}
…它在构造函数中接受两个字符串。
ICredentialProvider
的未来(实际)实现可能需要接受某些字符串以连接到适当的外部密码保险库或服务(或者两者都需要;目前项目中还不清楚)

此外,对于需要连接到的各种帐户(如SharePoint、ActiveDirectory和Windows Graph),项目使用了多个ICredentialProvider实例

为此,我知道如何通过代表注册:

container.RegisterWebApiRequest(() =>
    new FakedCredentialProvider(fakedSharePointUsername, fakedSharePointPassword));
…以及如何有条件地注册

container.RegisterConditional(typeof(ICredentialProvider), typeof(FakedCredentialProvider),
        context =>
        context.Consumer.Target.Name.ToLower().Contains("sharepoint")
    );
…但不是如何将两者结合起来


如何将这两种方法结合起来?或者:对于这种情况是否有更好的设计?

我不确定是否完全理解您的约束和设计,但是注册条件委托的方法是使用一个接受
注册
对象的
注册条件
重载:

var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();

container.RegisterConditional(typeof(ICredentialProvider),
    Lifestyle.Scoped.CreateRegistration(() => new FakedCredentialProvider(user, pwd), 
        container),
    c => c.Consumer.Target.Name.ToLower().Contains("sharepoint"));

我认为更好的设计是为每个凭证提供者创建不同的接口。这是因为使用sharepoint凭据提供程序的类无法与active directory凭据提供程序一起正常工作。凭证提供程序是不可互换的,因此,请在您的设计中对此加以区分。@Maarten嗯,返回的值是不可交换的,但外部合同是可交换的。不仅如此,证书最终都将存储在Cyberark的密码库或web服务中,因此SharePoint和AD access(例如)可能都使用CyberarkPasswordVaultCredentialProvider:ICredentialProvider。我觉得如果你说这不算是可互换的(从外部看,它们是相同的,并且共享具体的实现),那么实体驱动接口就永远不合适了?为什么不直接将这些凭据注入需要它们的类中(假设这些值不是运行时值,当然是配置值)。@Steven它们不是运行时,而是硬编码获取密码的方式(由于安全问题和密码更改问题,他们无法在内存中闲坐)给类一个不是它的目的的责任,一个额外的改变的理由,并且进一步将复制每个需要检索凭据的类的检索逻辑。总的来说,这对我来说是一个很大的损失。或者我理解错误了吗?如果我对设计不清楚,很抱歉;有时我很难得到它我的想法写在课文里。史蒂文,我很感激你的回答。