C# Ninject根据ctor参数名称创建多个绑定

C# Ninject根据ctor参数名称创建多个绑定,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,假设我有如下接口: public interface ISomething { }; public interface IResolver { string ResolveBy(ISomething something); } 现在我有两种解析器类型;一个提供最佳解决方案但有可能失败的解决方案和一个始终返回解决方案的解决方案,该解决方案应作为回退策略: public class UnsafeResolver : IResolver { Random random = new

假设我有如下接口:

public interface ISomething { };

public interface IResolver
{
    string ResolveBy(ISomething something);
}
现在我有两种解析器类型;一个提供最佳解决方案但有可能失败的解决方案和一个始终返回解决方案的解决方案,该解决方案应作为回退策略:

public class UnsafeResolver : IResolver
{
    Random random = new Random();

    public string ResolveBy(ISomething something)
    {
        if (random.NextDouble() > 0.5)
        {
            return "best solution ever!";
        }
        else
        {
            throw new InvalidOperationException("something went wrong...");
        }
    }
}

public class SafeResolver : IResolver
{
    public string ResolveBy(ISomething something)
    {
        return "fallback solution";
    }
}
现在,我想将这两个解析器合并到一个受保护的合成装饰器中:

public class SafeguardedResolver : IResolver
{
    private readonly IResolver unsafeResolver;
    private readonly IResolver safeResolver;

    // This is the problem with Ninject: Two parameters with same interface...
    public SafeguardedResolver(IResolver unsafeResolver, IResolver safeResolver)
    {
        // guards omitted!
        this.unsafeResolver = unsafeResolver;
        this.safeResolver = safeResolver;
    }

    public string ResolveBy(ISomething something)
    {
        try
        {
            return unsafeResolver.ResolveBy(something);
        }
        catch (InvalidOperationException)
        {
            return safeResolver.ResolveBy(something);
        }
    }
}
所以我的问题是:如果不使用策略,我如何实现与Ninject的绑定?我不希望对域类中的容器有任何依赖关系,因此建议的解决方案不适合我 我不希望对域类中的容器有任何依赖关系

您可以使用命名绑定,而无需从类库中引用容器,以下是您的操作方法:

StandardKernel kernel = new StandardKernel();

kernel
    .Bind<IResolver>()
    .To<SafeguardedResolver>()
    .WithConstructorArgument("unsafeResolver", c => c.Kernel.Get<IResolver>("unsafe"))
    .WithConstructorArgument("safeResolver", c => c.Kernel.Get<IResolver>("safe"));

kernel
    .Bind<IResolver>()
    .To<UnsafeResolver>()
    .Named("unsafe")
    .BindingConfiguration.IsImplicit = true;

kernel
    .Bind<IResolver>()
    .To<SafeResolver>()
    .Named("safe")
    .BindingConfiguration.IsImplicit = true;

在这样的情况下,纯DI的简单性是IMO的一个原因

我必须承认,我也读过Marc Seeman关于他对纯DI的“改变想法”的博客,他在他的杰出著作中称之为“穷人的DI”。我刚开始在一个项目中使用Ninject来获得印象。我觉得很难判断什么更好。两种方法都缺乏足够复杂的例子。我仍然想知道,纯DI的好模式是什么。
var result = new SafeguardedResolver(new UnsafeResolver(), new SafeResolver());