【问题标题】:Ninject, passing constructor argument to the kernelNinject,将构造函数参数传递给内核
【发布时间】:2012-02-16 11:55:29
【问题描述】:

这是我的问题: 每次我从内核请求一个实例时,我都想将其中一个值传递给构造函数。我在下面写了一些代码来说明这个问题。测试没有失败,所以我想这可行,但看起来确实很丑。使用 Ninject 是否有更好、更清洁的方法来完成此任务?还是我应该重新考虑我的设计?欢迎提出所有建议。

[TestFixture]
public class Sandbox
{
    [Test]
    public void Run_Forrest_Run()
    {
        using (var kernel = new StandardKernel(new Module()))
        {
            var connection = new Connection(Guid.NewGuid().ToString());
            var downloader = kernel.Get<IDownloader>(new IParameter[] { new Parameter("connection", connection, false) });

            Assert.That(downloader.Connection.Info, Is.EqualTo(connection.Info));
        }
    }

    public class Downloader : IDownloader
    {
        public Downloader(Connection connection, ILogger logger)
        {
            Connection = connection;
            Logger = logger;
        }

        public Connection Connection { get; private set; }

        public void Download()
        {
            Logger.Log("Downloading...");
        }

        public ILogger Logger { get; private set; }
    }

    public interface IDownloader
    {
        Connection Connection { get; }
        void Download();
    }

    public class ConsoleLogger : ILogger
    {
        public void Log(string message)
        {
            Console.Out.WriteLine(message);
        }
    }

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

    public class Connection
    {
        public Connection(string info)
        {
            Info = info;
        }

        public string Info { get; private set; }
    }

    public class Module : NinjectModule
    {
        public override void Load()
        {
            Bind<ILogger>().To<ConsoleLogger>();

            Bind<IDownloader>().To<Downloader>()
                .WithConstructorArgument("connection", context =>
                {
                    var p = context.Parameters.First(x => x.Name == "connection");
                    return p.GetValue(context, null);
                });
            }
    }
}

【问题讨论】:

    标签: c#-4.0 dependency-injection ninject-2


    【解决方案1】:

    如果您在解析IDownloader 时总是想指定Connection,那么我认为ConstructorArgument(即IParameter)就是您要寻找的:

    [Test]
    public void Run_Forrest_Run()
    {
        using (var kernel = new StandardKernel(new Module()))
        {
            var connection = new Connection(Guid.NewGuid().ToString());
            var downloader = kernel.Get<IDownloader>(new [] { 
                new ConstructorArgument("connection", connection) });
    
            Assert.That(downloader.Connection.Info, Is.EqualTo(connection.Info));
        }
    }
    
    public class Module : NinjectModule
    {
        public override void Load()
        {
            Bind<ILogger>().To<ConsoleLogger>();
            Bind<IDownloader>().To<Downloader>();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2015-10-11
      相关资源
      最近更新 更多