繁体   English   中英

简单注入器有条件地向代表注册

[英]Simple Injector Conditionally Register With Delegates

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

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")
    );

...但不是如何结合两者。

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

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

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"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM