首页
学习
活动
专区
圈层
工具
发布

与Ninject
EN

Stack Overflow用户
提问于 2015-01-25 15:42:19
回答 1查看 238关注 0票数 0

考虑下面的代码片段,其中我们使用ILogger实现了所有使用BaseLogger的应用程序。但是,我们有一个场景,我们需要为客户记录特定的某个地方,比如数据库或一些企业级应用程序监视器,这样我们就有了实现CustomerSpecificLoggerILogger

cTor for CustomerSpecificLogger需要传入一种类型的ILogger,在这种情况下,我们需要传入一个BaseLogger实例来执行这两个日志功能。

我知道如何将ILogger绑定到Ninject,但是如何绑定两个不同的ILoggers并告诉Ninject何时使用它们?

代码语言:javascript
复制
interface ILogger
    {
        void Log(string msg);
    }

    class BaseLogger : ILogger
    {
        public void Log(string msg)
        {
            Console.WriteLine(msg);
        }
    }

    class CustomerSpecificLogger : ILogger
    {
        private ILogger BaseLogger { get; set; }

        CustomerSpecificLogger(ILogger baseLogger)
        {
            BaseLogger = baseLogger;
        }

        public void Log(string msg)
        {
            //Log to somewhere specific per customer request
            BaseLogger.Log(msg);
        }
    }

我试过四处寻找这个,但我正在为这会被称为什么而挣扎。唉,我空手而归。

如果我试图绑定Update,希望它使用某种类型的索引来执行绑定,则会出错:

代码语言:javascript
复制
Bind<ILogger>().To<BaseLogger>();
Bind<ILogger>().To<CustomerSpecificLogger>();

错误:有多个匹配的绑定可用。

更新2 --这在尼尼姆中称为ContextualBinding,并被记录为这里

我想我已经弄清楚了。

EN

回答 1

Stack Overflow用户

发布于 2015-01-25 16:39:27

WithConstructorArgument(名称,值)听起来不是吗?

代码语言:javascript
复制
using System;
using System.Reflection;
using Ninject;
using Ninject.Modules;

public interface ILogger
{
    void Log(string msg);
}

public class BaseLogger : ILogger
{
    public void Log(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class CustomerSpecificLogger : ILogger
{
    private ILogger BaseLogger { get; set; }

    public CustomerSpecificLogger(ILogger baseLogger)
    {
        BaseLogger = baseLogger;
    }

    public void Log(string msg)
    {
        //Log to somewhere specific per customer request
        BaseLogger.Log(msg);
    }
}

// kernel.Load() in Program.Main() automatically load and bind this.
public class Bindings : NinjectModule
{
    public override void Load()
    {
#if true // or some App.config, anything...
        Bind<ILogger>().To<BaseLogger>().InSingletonScope();
#else
        Bind<ILogger>().To<CustomerSpecificLogger>().InSingletonScope().WithConstructorArgument("baseLogger", new BaseLogger());
#endif
    }
}

class Program
{
    static void Main(string[] args)
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());

        var logger = kernel.Get<ILogger>();

        logger.Log("Hello!");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28138187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档