简单的注射器有条件地注册代表

时间:2016-05-10 18:01:00

标签: c# dependency-injection simple-injector

我正在编写一个使用以下界面定义的类的应用程序:

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的未来(实际)实现可能需要接受某些字符串来连接到适当的外部密码保险库或服务(或者可能两者;在项目的这一点上还不清楚)。

此外,该项目使用多个ICredentialProvider实例来连接所需的各种帐户(例如SharePoint,ActiveDirectory和Windows Graph)。

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

container.RegisterWebApiRequest(() =>
    new FakedCredentialProvider(fakedSharePointUsername, fakedSharePointPassword));

......以及如何有条件地注册......

container.RegisterConditional(typeof(ICredentialProvider), typeof(FakedCredentialProvider),
        context =>
        context.Consumer.Target.Name.ToLower().Contains("sharepoint")
    );

......但不是如何将两者结合起来。

如何结合这两种方法?或者:对于诸如此类的情况,是否有更好的设计?

1 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解您的约束和设计,但是注册条件委托的方法是使用接受Registration对象的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")); 重载之一:< / p>

bajaj-4S-champion
bajaj-avenger
audi-a3-diesel
audi-a3-petrol
相关问题