通过ParentRequest进行Ninject Contextual绑定

时间:2015-03-05 03:16:01

标签: c# dependency-injection ninject

我是使用Ninject并将依赖注入应用于我的代码的新手。因此,我想确保我不会使解决方案复杂化或破坏使用Ninject和依赖注入的好处。

以下代码是我想要完成的简化概念示例。我想知道是否有更好的方法来产生相同的结果或者我是否应该考虑修改我的设计。我理解另一种解决方案是通过方法注入为IService和IProvider提供上下文并使用WhenInjectedInto方法,但这与我尝试使用该接口的方式不符。

    public interface IContext
    {
    }

    public interface IProvider
    {
        IContext Context { get; }
    }

    public interface IService
    {
        IProvider Provider { get; }
    }

    public interface IBindingContext
    {
        IService Service { get; }
    }

    public CreateBindings()
    {
        this.kernel = new StandardKernel();
        this.kernel.Bind<IContext>().To<GenericContext>();
        this.kernel.Bind<IProvider>().To<GenericProvider>();
        this.kernel.Bind<IService>().To<GenericService>();

        // Do not want to create specific implementations
        //this.kernel.Bind<IContext>().To<SpecificContext>().WhenInjectedInto<SpecificProvider>();
        //this.kernel.Bind<IProvider>().To<SpecificProvider>().WhenInjectedInto<SpecificService>();
        //this.kernel.Bind<IService>().To<SpecificService>().WhenInjectedExactlyInto<SpecificBindingContext>();

        this.kernel.Bind<IContext>().To<SpecificContext>().When(x => this.IsUsedBy<SpecificBindingContext>(x));
    }

    private bool IsUsedBy<T>(IRequest request)
    {
        if (request == null)
            return false;

        if (request.Service == typeof(T))
            return true;

        if (this.IsUsedBy<T>(request.ParentRequest))
                return true;

        return false;
    }

我正在处理的实际接口是:

public interface ILogDirectory
{
    string FullPath { get; }
}

public interface ILogProvider
{
    void Write(string text);
}

public interface ILogService
{
    void Write(Exception exception);

    void Write(string text);

    void WriteDebug(string text);
}

我遇到的问题是我不希望客户端代码知道如何或在何处记录信息。如果我创建包含ILogDirectory签名的Write方法,我将暴露许多实现细节。此时,我可以非常轻松地创建特定于上下文的日志实现,但每个实现唯一唯一的事情是包含日志文件的目录。因此,我宁愿不必为每个接口创建特定于上下文的实现。

1 个答案:

答案 0 :(得分:0)

我认为你想要的是上下文绑定:

https://github.com/ninject/Ninject/wiki/Contextual-Binding

如果你有一个更复杂的场景,你也可以使用提供者:

https://github.com/ninject/Ninject/wiki/Providers%2C-Factory-Methods-and-the-Activation-Context